[英]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的类型擦除有关-这可能吗? 我传递类型的对象CodominantOrganism
到CodominantPopulation
编译程序之前。
编辑: 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.