Est-il possible en Java de créer une méthode/classe d'usine statique qui utilise une interface comme type paramétré et renvoie une classe d'implémentation de cette interface donnée?Java statique paramétrée usine statique générique
Bien que ma connaissance de Generics est limité, voici ce que je veux faire:
// 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();
}
}
}
Je veux limiter le code client seulement insérer une interface « type » dans la méthode getInstance() qui se prolonge à partir de l'interface d'outil que j'ai spécifiée. De cette façon, je sais avec certitude que le type d'outil inséré est un outil légitime.
code client devrait ressembler à ceci:
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(... , ...);
}
}
L'usine doit passer sur le type de l'interface (négligente si elle est nulle ou non), défini avant demande de l'usine. Je sais que cela ne fonctionnera pas comme je l'ai écrit, mais j'espère que l'un des lecteurs sait ce que je veux accomplir. Le type de retour de la méthode getInstance est le même que le paramètre entrant. Ainsi, lorsqu'une interface Parser est transmise, elle renvoie également un analyseur Parser p = new ParserImpl(); retour p;
Merci d'avance de votre aide.
C'est exactement la façon de le faire. –
Merci pour votre réponse. D'une manière ou d'une autre, je n'arrive pas à ce que cela fonctionne comme je l'avais en tête ... Pourriez-vous s'il vous plaît élaborer sur les appels du code client et le Callable extends Outil> suggestion?Je vais ignorer le mappage car l'application ne dispose que de quelques outils et ne s'étend pas au-delà. – user504342