[英]Cast to super class type a “Class”
我有一个界面
interface Inter extends Blah {
public void someMethod();
}
class Dummy {
Class<Blah> interfaceType;
public setInterfaceType( Class<Blah> input ) {
this.interfaceType = input;
}
}
class tester {
public void init() {
Dummy dummyObj = new DummyObj();
dummyObj.setInterfaceType( Inter.class ); //This complains that the type is not suitable
}
}
编译错误:
Dummy类型的方法setInterfaceType(Class)不适用于参数(Class)
我在调用setter时尝试将input
强制转换为Class<Blah>
,但这也是不允许的。 我不明白为什么它不接受子类类型的类。 谁能告诉我这里发生了什么以及如何调用设置器。 Dummy
类是外部的,所以我不能更改它。
泛型不是协变的,因此您不能设置为Class<Inter>
类型的Class<Inter>
Class<Blah>
对象。 想一想。 如果您可以使用List<Fruit> list = new ArrayList<Apple>()
那么通过list
您不仅可以添加苹果,还可以添加其他水果。 这样可以吗
要解决此问题,请尝试将Class<Blah>
更改为Class<? extends Blah>
Class<? extends Blah>
您也可以将Dummy
类更改为使用通用类型T
class class Dummy<T extends Blah> {
Class<T> interfaceType;
public void setInterfaceType(Class<T> input) {
this.interfaceType = input;
}
}
并像这样使用
Dummy<Inter> dummyObj = new Dummy();
dummyObj.setInterfaceType(Inter.class);
您最肯定的意思是
Class<? extends Blah> interfaceType;
public setInterfaceType( Class<? extends Blah> input ) {
this.interfaceType = input;
}
更新资料
如果无法修改Dummy类,那么那就是dubius了,为什么会有这样的setter方法。 但是无论如何,您可以通过将参数强制转换为Class(不带type参数)来避免“泛型”检查,如下所示:dummyObj.setInterfaceType((Class)Inter.class)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.