我有一个界面
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>
,但也不允许这样做。我不明白为什么它不接受一类子类型。任何人都可以告诉我这里发生了什么,以及如何调用setter。 Dummy
类是外部的,所以我无法改变它。
答案 0 :(得分:3)
Generics are not covariant因此您无法设置Class<Blah>
Class<Inter>
类型的对象。想一想。如果您能够使用List<Fruit> list = new ArrayList<Apple>()
然后通过list
,您将不仅可以添加苹果,还可以添加其他水果。那可以吗?
要解决此问题,请尝试将Class<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);
答案 1 :(得分:0)
你肯定意味着
Class<? extends Blah> interfaceType;
public setInterfaceType( Class<? extends Blah> input ) {
this.interfaceType = input;
}
<强>更新强>
如果Dummy类不能被修改,那么为什么有这样的setter方法就是dubius。但无论如何,你可以避免使用&#34;泛型类型&#34;通过将您的参数转换为Class(不带类型参数)来检查,如:dummyObj.setInterfaceType((Class)Inter.class)