繁体   English   中英

不可转换的类型; 不能施放'捕获<!--? extends IEntity--> '到'java.lang.Class<t> '</t>

[英]Inconvertible types; cannot cast 'caputure<? extends IEntity>'to 'java.lang.Class<T>'

共有三个 class,class IEntity 是一个抽象的 class,仅用于泛型。

Class 一:

public abstract class IEntity {
}

class 二:

public class Config {
    private Class<? extends IEntity> clazz;

    public Class<? extends IEntity> getClazz(){
        return this.clazz;
    }
}

class 三:

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();
    }
}

看来你还没有理解<? extends IEntity> <? 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<? extends IEntity>Class<T> ,其中TIEntityIEntity本身的子类。 问题是,我们不知道究竟是什么类型的 class getClazz返回。 它可以是Class<Entity1>Class<Entity2> 另一方面,我们确实知道我们需要什么类型 - Class<T> 我们如何确保无论getClazz返回什么类型的 class 与Class<T>相同? T可以是Entity2getClazz可以返回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>相同类型的 class 的一种方法是使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();
    }
}

<? extend IEntity> <? extend IEntity>表示 class 必须是 IEntity 或其子类。 您代码中的“T”只是 IEntity 的一个子类( <? extend IEntity>可以有很多子类),您不能确定<? extend IEntity> <? extend IEntity>与“T”相同或者是“T”的子类。 所以类型转换是非法的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM