Java параметризованный универсальный статический завод

Возможно ли в Java создать статический фабричный метод / класс, который использует интерфейс в качестве параметризованного типа, и вернуть реализующий класс этого данного интерфейса?

Хотя мои знания в области дженериков ограничены, я хочу сделать следующее:

// define a base interface:
public interface Tool {
    // nothing here, just the interface.
}

// define a parser tool:
public interface Parser extends Tool {
    public ParseObject parse(InputStream is); 
}

// define a converter tool:
public interface Converter extends Tool {
    public ConvertObject convert(InputStream is, OutputStream os);
}

// define a factory class
public class ToolFactory {
    public static <? extends Tool> getInstance(<? extends Tool> tool) {
       // what I want this method to return is:
       // - ParserImpl class, or
       // - ConverterImpl class
       // according to the specified interface.
       if (tool instanceof Parser) {
          return new ParserImpl();
       }
       if (tool instanceof Converter) {
          return new ConverterImpl();
       }
    }
}

Я хочу ограничить клиентский код, чтобы он вставлял только интерфейсный тип в метод getInstance (), который расширяется из интерфейса Tool, который я указал. Таким образом, я точно знаю, что вставленный тип инструмента является законным инструментом.

Код клиента должен выглядеть так:

public class App {
   public void main(String[] args) {

      Parser parser = null;
      Converter converter = null;

      // ask for a parser implementation (without knowing the implementing class)
      parser = ToolFactory.getInstance(parser);

      // ask for a converter implementation
      converter = ToolFactory.getInstance(converter);

      parser.parse(...);
      converter.convert(... , ...);
   }
}

Фабрика должна включить тип интерфейса (небрежно, если он нулевой или нет), определенный до того, как его запросят с фабрики. Я знаю, что это не сработает так, как я написал это, но я надеюсь, что один из читателей знает, чего я хочу достичь.

Тип возвращаемого значения метода getInstance совпадает с входящим параметром, поэтому при передаче интерфейса Parser он также возвращает Parser p = new ParserImpl (); возврат р;

Заранее спасибо за помощь.

Ответы на вопрос(1)

Ваш ответ на вопрос