不可转换的类型;无法施放“俘虏<?将IEntity>'扩展为'java.lang.Class <T>'

时间:2019-10-25 07:28:51

标签: java

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

2 个答案:

答案 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>,其中TIEntity或{{1 }}本身。问题是,我们不完全知道返回什么类型的类IEntity。可以是getClazzClass<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”的子类“。所以类型转换是非法的。