我正在尝试执行以下操作之一:
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)?关键是超类不应该关心对象的类型,因此功能可能因扩展类而异。
答案 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()