将泛型类类型转换为其实例的非泛型或调用方法?

时间:2010-09-06 14:46:25

标签: java generics

我正在尝试执行以下操作之一:

Dummy d = (Class<Dummy>)super.getEntity();  // incompatible Types - cannot cast
Dummy d = (Dummy)super.getEntity();  // incompatible Types - cannot cast
d.foo();

Class<Dummy> d = (Class<Dummy>)super.getEntity(); // works
d.foo(); // method cannot be found

虚拟d在抽象超类中定义如下:

Class<T> dummy;
public Class<T> getEntity() { return dummy; }

有没有办法在Generic类类型的对象中调用方法(foo)?关键是超类不应该关心对象的类型,因此功能可能因扩展类而异。

1 个答案:

答案 0 :(得分:2)

您的getEntity()方法返回类令牌,而不是该类的实例,因此您无法在其上调用foo(),只能在界面中定义的方法java.lang.Class。您需要首先实例化该类(通过调用newInstance() - 它要求该类具有公共默认构造函数),然后您有一个类对象,您可以在其上调用{{1 }}:

foo()

注意:

  • 由于Class<Dummy> clazz = super.getEntity(); try { Dummy d = clazz.newInstance(); d.foo(); } catch (...) { } 是通用的,它将返回正确的类类型,因此不需要转换为getEntity()
  • Class<Dummy>可能抛出必须处理的各种异常,因此是try-catch块。这是反映不是解决此类问题的首选方式的原因之一,
  • 因为在派生类中你知道基类中使用的确切类型参数,所以这段代码不必要地冗长而且非常人为。

或者,您可能希望从Class.newInstance()而不是T返回getEntity() - 这样您就可以直接在返回的对象上调用Class<T>。请注意,由于您无法直接实例化泛型类型,因此您需要将类的实例传递给超类(例如,作为构造函数参数,或通过重写的虚方法),或者使用如上所述的反射创建它。 / p>

以下是使用构造函数参数的方法:

foo()