そのため、インターフェイスSuperType
と一連の実装クラスなどTypeA
を取得TypeB
しました。パラメータ化されたメソッドを持つトップレベルのインターフェースも取得しました。
public interface UsedByProductThing<T extends SuperType> {
public T doStuff(T one);
}
を実装するオブジェクトを生成するファクトリ(以下を参照)を取得しましたGeneralProduct
:
public interface GeneralProduct<T extends SuperType> {
T doSomething(T input);
}
実装は次のProductA
とおりです。
public class ProductA implements GeneralProduct<TypeA> {
UsedByProductThing<TypeA> in;
public ProductA(UsedByProductThing<TypeA> in) {
this.in = in;
in.doStuff(new TypeA());
}
@Override
public TypeA doSomething(TypeA input) {
return null;
}
}
そして今問題の工場:
public class GeneralFactory {
public static <T extends SuperType> GeneralProduct<T> createProduct(
int type, UsedByProductThing<T> in) {
switch (type) {
case 1:
return (GeneralProduct<T>) new ProductA((UsedByProductThing<TypeA>) in);
// at this point, i want to return a "new ProductA(in)" preferably
// without casting
// or at least without the cast of the argument.
default:
throw new IllegalArgumentException("type unkown.");
}
}
}
コメントしたように、その factory-method でキャストを使用しないようにします。戻り値の型が GeneralProduct でなければならないことは理解していますが、キャストを省略する方法は考えられません (「チェックされていないキャスト」という警告も表示されます)。また、引数のキャストを省略する方法が思い浮かびません。その場所で「安全でない」キャストを取り除く必要がある場合は、コード全体を再構築できます。ここでうまくスムーズになる方法を教えてもらえますか?
また、私の質問を好きなように編集してください - タイトルの問題を正しく解決する方法がわかりません。
どうもありがとう!