所以我得到了一个接口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.");
}
}
}
正如评论的那样,我希望工厂方法不使用演员表。我知道返回类型必须是 GeneralProduct,但我想不出一种省略演员表的方法(它也给了我一个“未经检查的演员表”警告)。另外,我想不出一种省略论点的方法。如果有必要摆脱那个地方的“不安全”铸造,我可以重组整个代码。你能告诉我一个在这里又好又顺利的方法吗?
另外,请根据需要编辑我的问题-我不知道如何在标题中正确解决该问题。
非常感谢!