繁体   English   中英

Java泛型-类型擦除有问题吗?

[英]Java Generics - An Issue with Type Erasure?

我有一个通用类CodominantPopulation ,它是另一个通用类SexualPopulation的子类,而SexualPopulation本身是一个通用类( Population )的子类。 上述类的定义如下:

public class CodominantPopulation<O extends CodominantOrganism> extends SexualPopulation<O> {

public CodominantPopulation(List<O> organisms) {
        super(organisms);
    }
    ...
}

public class SexualPopulation<O extends SexualOrganism> extends Population<O> {
    public SexualPopulation(List<O> organisms){
        super(organisms);
    }
    ...
}

所述CodominiantOrganism以上是的一个子类SexualOrganism ,它本身就是一个的子类(如可预期的) Organism CodominantPopulation ,我调用了仅对CodominantOrganisms可用的CodominantOrganisms ,其调用方式如下:

// in CodominantPopulation
for (O organism : population){
    // organism must be a CodominantOrganism
    CodominantGenotype.Dominance dominance = organism.getTraitDominance(trait);
    ...
}

但是,运行时将抛出:

Exception in thread "main" java.lang.ClassCastException: SexualOrganism cannot be cast to util.CodominantOrganism
    at CodominantPopulation.countDominance(CodominantPopulation.java:xx)
        ...

我不确定如何解释/修复此错误。 我已经进行了一些研究,似乎这可能与Java的类型擦除有关-这可能吗? 我传递类型的对象CodominantOrganismCodominantPopulation编译程序之前。

编辑: Population的定义如下:

public class Population<O extends Organism> {
    List<O> population;

    public Population(List<O> organisms){
        this.population = new ArrayList<>();
        this.population.addAll(organisms);
    }
    ...
}

我的猜测是,泛型类型的问题较少,而继承是基于将尚未准备好的对象传递给超级对象的继承 也许您有工厂方法或构造函数尝试传递尚未建立的CodominantOrganism

这可以通过几种方式发生。

class A
    A (X y) { f(y); }
    protected void f(X x) { }

class B
    B (X y) { super(y); f(y); }
    @Override
    protected void f(X x) { }

在这里,A的构造函数确实调用了B的f,但其中B尚未就绪。

幸运的是,IDE警告您不要在构造函数中使用非最终方法,但是其他相同类型的模式也是可能的。 也许使用FindBugs来检查代码不一致。

我可能是错的,但泛型类型似乎不是罪魁祸首。

暂无
暂无

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

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