我有这两个班级
abstract class A
{
//some abstract methods and variables
}
class B<E extends A>
{
}
现在在B的方法中,我想得到一个E的虚拟实例。怎么做? 这没关系 -
E temp = (E)(new Object());
我可以控制类定义,因此它们很灵活。
答案 0 :(得分:3)
您需要将工厂对象(或实例)传入B
的构造函数。无法指定泛型类型参数具有特定构造函数,并且静态类型在运行时不可用。
(你可以使用E temp = (E)new A() { };
伪造一个显着的值,但这很狡猾。有些集合代码只对数组做类似的事情。)
答案 1 :(得分:3)
你有2个解决方案:
E
有一个无参数构造函数,则可以使用反射来构建一个。abstract E buildE();
对于第一个解决方案,您必须将该类作为构造函数的参数传递:
class B<E extends A>{
public B(Class<E> clazz){
//Create instance of E:
E e=clazz.newInstance();
}
}
对于 second 解决方案,这意味着B类有一个抽象方法来构建对象(它或多或少等同于传递工厂):
public class B<E extends A>{
public abstract E buildE();
private void foo(){
E e = buildE();
//Do generic stuff with E
}
}
这样,如果创建B的子类,则需要实现此方法
public class B1 extends B<Bar>{
//You are required to implement this method as it is abstract.
public Bar buildE(){
..
}
private void anyMethod(){
//call B.foo() which will use B1.buildE() to build a Bar
super.foo();
}
}
恕我直言,第二种解决方案更加清洁。
答案 2 :(得分:-1)
您可以使用B中的反射来获取Class<E>
,然后获取所需的构造函数并调用newInstance
(Class<E>)((ParameterizedType)this.getClass().getGenericSuperclass()).getActualTypeArguments()[0]