2

我有这两个课

abstract class A
{
//some abstract methods and variables
}

class B<E extends A>
{
}

现在在 B 的方法中,我想获得 E 的虚拟实例。怎么做?这个可以吗 -

E temp = (E)(new Object());

我可以控制类定义,因此它们很灵活。

4

3 回答 3

3

您需要将工厂对象(或实例)传递给B. 无法指定泛型类型参数具有特定的构造函数,并且静态类型在运行时不可用。

(你可以用 伪造一个可分辨的值E temp = (E)new A() { };,但这很狡猾。一些集合代码只对数组做了类似的事情。)

于 2013-06-21T13:54:10.817 回答
3

您有 2 个解决方案:

  • 如果E有一个无参数的构造函数,你可以使用反射来构建一个。
  • 您可以制作一个抽象方法abstract E buildE();

对于第一个解决方案,您必须将类作为构造函数的参数传递:

class B<E extends A>{

  public B(Class<E> clazz){
    //Create instance of E:
    E e=clazz.newInstance();
  }
}

对于第二种解决方案,这意味着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();
  }

}

恕我直言,第二种解决方案要干净得多。

于 2013-06-21T13:55:32.757 回答
-1

您可以在 B 中使用反射来获取Class<E>,然后获取所需的构造函数并调用newInstance

(Class<E>)((ParameterizedType)this.getClass().getGenericSuperclass()).getActualTypeArguments()[0]
于 2013-06-21T14:16:16.767 回答