我陷入了以下困境。我有一个名为Fusion的抽象类,它应该有一个所谓的ClusteringObjects的TreeSet(它也是一个抽象类)。因此我将类型设置为
public abstract class Fusion {
protected TreeSet<? extends ClusteringObject> metadata;
//CODE
}
在Fusion的子类(称为TemporalFusion)中,我想将TemporalClusteringObjects(ClusteringObject的子类)添加到TreeSet中,但这不起作用。
public class TemporalFusion extends Fusion {
public TemporalFusion(Model metadataModel, String fusionId) {
//CODE ...
metadata = new TreeSet<TemporalClusteringObject>(new TimestampComparator());
}
public void add(int metadataIndex, ParsedMetadata singleMetadata) {
//create temporalClusteringObject (works fine)
metadata.add(temporalClusteringObject);
}
}
添加会导致以下失败:
The method add(capture#2-of ? extends ClusteringObject) in the type TreeSet<capture#2- of ? extends ClusteringObject> is not applicable for the arguments (TemporalClusteringObject)
是否存在这个问题的通用解决方案,并非Fusion的每个子类都必须实现自己的元数据TreeSet,并且ClusteringObject继承自己的条目类型?
答案 0 :(得分:2)
元数据成员应使用具体的泛型。要么只是将它设置为ClusteringObject,要么为Fusion声明一个通用类。
示例:
public abstract class Fusion<T extends ClusteringObject> {
protected TreeSet<T> metadata;
...
然后像这样声明派生类:
public class TemporalFusion extends Fusion<TemporalClusteringObject> {
它应该工作。