パラメータ化された型としてインターフェイスを使用し、この特定のインターフェイスの実装クラスを返す静的ファクトリ メソッド/クラスを 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() メソッドにインターフェイス「タイプ」のみを挿入するようにクライアント コードを制限したいと考えています。このようにして、挿入されたツールタイプが正当なツールであることを確実に知ることができます。
クライアント コードは次のようになります。
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(... , ...);
}
}
ファクトリは、ファクトリから要求される前に定義されたインターフェイスのタイプをオンにする必要があります (null かどうかは気にしないでください)。これが私が書いた方法ではうまくいかないことはわかっていますが、読者の 1 人が私が達成したいことを知っていることを願っています。
getInstance メソッドの戻り値の型は受信パラメーターと同じであるため、Parser インターフェイスが渡されると、Parser p = new ParserImpl(); も返されます。p を返します。
助けてくれてありがとう。