我已经定义了这样一个类:
public class MyClass<T implements MyInterface> {
public T getMy() {
return new T();
}
}
这不会编译。我不允许创建泛型类型T.
我该如何解决这个问题?这样做有什么好的模式吗?我可以通过使用抽象类而不是接口来解决这个问题吗?我必须使用反射吗?
答案 0 :(得分:3)
您无法在此使用implements
。
<T implements MyInterface> // can't use interface.
所以你可以在那里使用Abstract Class
<T extends MyAbstractClass>
答案 1 :(得分:1)
public class MyClass<T extends MyInterface> {
T getMy(Class<T> clazz) throws InstantiationException, IllegalAccessException
{
return clazz.newInstance();
}
}
答案 2 :(得分:1)
您可以通过传递实际的类类型(例如构造函数),Class<T>
并在其上调用newInstance()
来实现此目的,如果默认构造函数对您没有问题。
如果您需要其他构造函数,则需要使用反射API,例如通过getDeclaredConstructors()
在这个非常类的类型对象上。
答案 3 :(得分:0)
这里有一些问题。
创建有界泛型类型的语法不正确;您需要使用extends
关键字。 {@ 3}}在这个意义上,因为它曾经意味着泛型类型可以扩展另一个类,或者实现一个接口。
您无法直接实例化泛型类型。这是一种笨拙的方式(没有反射,因为它),The extends
keyword is more general:
public T getInstance(Class<T> clazz) throws IllegalAccessException, InstantiationException {
return clazz.newInstance();
}