2014-03-05 44 views
0

我陷入了下面的情況。我有一個叫做Fusion的抽象類,它應該有一個所謂的ClusteringObjects(也是一個抽象類)的TreeSet。因此,我將類型設置爲泛型:Treeset添加一個子類

public abstract class Fusion { 
    protected TreeSet<? extends ClusteringObject> metadata; 
     //CODE 
} 

在融合(被稱爲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) 

是否有一個通用的解決這個問題,即不融合的每個子類必須實現自己的元數據TreeSet中與ClusteringObject繼承它自己的條目類型?

+0

你可以讓'TreeSet 在你的情況下工作嗎? – dasblinkenlight

+0

@dasblinkenlight:既然'ClusteringObject'是一個抽象類,這是行不通的。 – BaCci

回答

2

元數據成員應該使用具體的泛型。要麼將其設置爲ClusteringObject,要麼爲Fusion聲明一個通用的類。

例子:

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

然後聲明派生類是這樣的:

public class TemporalFusion extends Fusion<TemporalClusteringObject> { 

它應該工作即可。

+0

謝謝,這個工作正常! – BaCci