共有三个类,IEntity类是抽象类,仅用于泛型。
第一类:
public abstract class IEntity {
}
第二课:
public class Config {
private Class<? extends IEntity> clazz;
public Class<? extends IEntity> getClazz(){
return this.clazz;
}
}
第三课:
public class EntityTest<T extends IEntity> {
private Class<T> clazz;
public void init(Config config){
//Here is the wrong report
// Failed to compile
this.clazz=config.getClazz();
}
}
答案 0 :(得分:0)
您似乎还不了解<? extends IEntity>
和<T extends IEntity>
之间的区别。
让我们介绍IEntity
的两个子类,以及Config
的构造函数,以得到更清晰的解释:
class Entity1 extends IEntity {}
class Entity2 extends IEntity {}
// in Config class
public Config(Class<? extends IEntity> clazz) {
this.clazz = clazz;
}
在行this.clazz=config.getClazz();
上,您尝试将Class<? extends IEntity>
分配给Class<T>
,其中T
是IEntity
或{{1 }}本身。问题是,我们不完全知道返回什么类型的类IEntity
。可以是getClazz
或Class<Entity1>
。另一方面,我们要做知道我们需要什么类型-Class<Entity2>
。我们如何确保无论Class<T>
返回的类与getClazz
属于同一类? Class<T>
可以是T
,但是Entity2
可以返回getClazz
,不是吗?
这是一个带有代码的具体示例:
Class<Entity2>
现在您应该了解为什么Config c = new Config(Entity1.class);
// c.config now contains Entity1.class
// the line below will attempt to assign an Entity1.class to a variable of type Class<Entity2>
new EntityTest<Entity2>().init(c);
中存在错误。
确保init
返回与getClazz
相同类型的类的一种方法是也使Class<T>
通用:
Config
答案 1 :(得分:0)
<? extend IEntity>
表示该类必须是IEntity或其子类。您代码中的“ T”只是IEntity的一个子类(<? extend IEntity>
可以有很多子类),您不能确定<? extend IEntity>
是否与“ T”相同或是“ T”的子类“。所以类型转换是非法的。