泛型:Treeset添加一个子类

时间:2014-03-05 13:14:26

标签: java generics abstract superclass treeset

我陷入了以下困境。我有一个名为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继承自己的条目类型?

1 个答案:

答案 0 :(得分:2)

元数据成员应使用具体的泛型。要么只是将它设置为ClusteringObject,要么为Fusion声明一个通用类。

示例:

public abstract class Fusion<T extends ClusteringObject> { protected TreeSet<T> metadata; ...

然后像这样声明派生类:

public class TemporalFusion extends Fusion<TemporalClusteringObject> {

它应该工作。