不可转换类型;不能施放"caputure<? 将 IEntity> 扩展到'java.lang.Class<T>'



有三个类,类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();
}
}

<? extend IEntity>表示类必须是IEntity或其子类。代码中的"T"只是IEntity的一个子类(<? extend IEntity>可以有很多个子类(,您不能确定<? extend IEntity>是否与"T"相同或是"T"的子类。所以类型铸造是非法的。

您似乎还没有理解<? 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>,其中TIEntityIEntity本身的子类。问题是,我们不知道getClazz到底返回了什么类型的类。它可以是Class<Entity1>Class<Entity2>。另一方面,我们确实知道我们需要什么类型的Class<T>。我们如何确保无论getClazz返回什么,都是与Class<T>相同类型的类?T可以是Entity2,但getClazz可以返回Class<Entity1>,不是吗?

下面是一个代码为的具体示例

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也通用:

class Config<T extends IEntity> {
private Class<T> clazz;
public Class<T> getClazz(){
return this.clazz;
}
}
class EntityTest<T extends IEntity> {
private Class<T> clazz;
public void init(Config<T> config){
this.clazz=config.getClazz();
}
}

最新更新