[英]Java: factory with method type parameters for class generic
我为其他一些通用接口A<T>
创建了一个工厂接口:
public interface Factory<T, X extends A<T>> {
public X create();
}
现在我遇到的问题是我需要为每一种类型T实例化一个工厂。 这变得非常不方便,特别是如果某些代码想要从A<T>
到A<T2>
,其中T2是一些以前未知的类型或者有太多不同的T2 ,我不想指定数百个工厂对于每个特例。
我想将类型T作为create方法的泛型参数传递。 这样我得到的东西(注意,不正确的Java :-)):
public interface Factory<X extends A<?>> {
public <T> X<T> create();
}
Factory的实现可能只需执行以下操作:
public class Factory4B implements Factory<B> {
public <T> X<T> create() {
return new B<T>();
}
}
将以上版本的接口写下来会给出create的返回值的错误消息:
X型不是通用的; 它不能用参数参数化
有没有办法实现这样的通用工厂,还是我需要使用完全不同的方法? 我希望能够在类级别指定X ,这样我就可以轻松地实例化X. 我不想为每个参数T创建一个Factory
感谢您抽出时间提前回答这个问题。
根据下面的评论重新思考问题,我的问题是不可能实现的,因为不可能保证通用参数仍然存在于A<T>
的子类中,或者换句话说:没有泛型的继承参数。
例:
A<String>
派生的C类。 C<Integer>
。 C<Integer>
一般Factory 不,仅凭仿制药是不可能的。 由于“类型擦除”, T
的类型在运行时不再存在,因此Java不知道要调用的构造函数。
您必须找到一种方法在运行时将T
类型传递给您的类。 在Java中,您可以使用类Class<S>
作为运行时类型标记 。 然后你的代码看起来像这样:
public <T> X<T> create(Class<T> classOfT) {
T t = classOfT.newInstance();
return new X<T>(t);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.