我陷入以下情况。我得到了一个名为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继承的其自己的条目类型?

最佳答案

元数据成员应使用具体的泛型。只需将其设置为ClusteringObject或为Fusion声明一个通用类。

例:

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

然后像这样声明派生类:

public class TemporalFusion extends Fusion<TemporalClusteringObject> {


那应该可以了。

09-10 14:44