fábrica estática genérica parametrizada java

É possível em Java criar um método / classe estático de fábrica que use uma interface como o tipo parametrizado e retornar uma classe de implementação dessa interface?

Embora meu conhecimento de genéricos seja limitado, eis o que eu quero fazer:

// 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();
       }
    }
}

Desejo restringir o código do cliente para inserir apenas um 'tipo' de interface no método getInstance () que se estende da interface da ferramenta especificada. Dessa forma, tenho certeza de que o tipo de ferramenta inserido é uma ferramenta legítima.

O código do cliente deve ficar assim:

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(... , ...);
   }
}

A fábrica deve ligar o tipo de interface (descuidado se for nulo ou não), definido antes de ser solicitado à fábrica. Sei que isso não vai funcionar da maneira como escrevi isso, mas espero que um dos leitores saiba o que quero realizar.

O tipo de retorno do método getInstance é o mesmo que o parâmetro de entrada; portanto, quando uma interface do Analisador é passada, ele também retorna um Analisador p = new ParserImpl (); retorno p;

Agradecemos antecipadamente por me ajudar.

questionAnswers(1)

yourAnswerToTheQuestion