2017-02-10 67 views
0

我有以下代碼(簡化,以示出芯問題):接口實現傳播

public interface IElement {} 


public interface IDataSet<E extends IElement> {} 


public interface IPropertyTranslator<D extends IDataSet<? super E>, E extends IElement> {} 


public interface IElementTranslator<D extends IDataSet<?>> {} 


public class AnimalElement implements IElement {} 


public class AnimalDataSet implements IDataSet<AnimalElement> {} 


public class AnimalPropertyTranslator implements IPropertyTranslator<AnimalDataSet, AnimalElement> {} 


public class UniversalPropertyTranslator implements IPropertyTranslator<IDataSet<IElement>, IElement> {} 


public class ElementTranslator<D extends IDataSet<? super E>, E extends IElement> implements IElementTranslator<D> { 

    public Collection<IPropertyTranslator<? super D, ? super E>> propertyTranslators = new HashSet<>(); 

} 


public class Demo { 

    public static void demo() { 
     ElementTranslator<AnimalDataSet, AnimalElement> animalElementTranslator = new ElementTranslator<>(); 
     animalElementTranslator.propertyTranslators.add(new AnimalPropertyTranslator()); 
     animalElementTranslator.propertyTranslators.add(new UniversalPropertyTranslator()); 
    } 

} 

不幸的是,該演示方法的最後一行產生以下錯誤:The method add(IPropertyTranslator<? super AnimalDataSet,? super AnimalElement>) in the type Collection<IPropertyTranslator<? super AnimalDataSet,? super AnimalElement>> is not applicable for the arguments (UniversalPropertyTranslator)。通過我發現的隨機試驗,發現問題可能與<D extends IDataSet<? super E>, E extends IElement>表達式有關,儘管我仍然不知道如何解決這個問題。

在此期間代碼以下variantion完美的作品:

public interface IDataSet {} 


public interface IPropertyTranslator<D extends IDataSet> {} 


public interface IElementTranslator<D extends IDataSet> {} 


public class AnimalDataSet implements IDataSet {} 


public class AnimalPropertyTranslator implements IPropertyTranslator<AnimalDataSet> {} 


public class UniversalPropertyTranslator implements IPropertyTranslator<IDataSet> {} 


public class ElementTranslator<D extends IDataSet> implements IElementTranslator<D> { 

    public Collection<IPropertyTranslator<? super D>> propertyTranslators = new HashSet<>(); 

} 


public class Demo { 

    public static void demo() { 
     ElementTranslator<AnimalDataSet> animalElementTranslator = new ElementTranslator<>(); 
     animalElementTranslator.propertyTranslators.add(new AnimalPropertyTranslator()); 
     animalElementTranslator.propertyTranslators.add(new UniversalPropertyTranslator()); 
    } 

} 

我不明白,爲什麼在接口的第二通用部分導致代碼以不同的表現。

+0

[Java中之間的區別](http://stackoverflow.com/questions/4343202/difference-between-super-t-and-extends-t-in-java)的可能的複製 –

+0

可能的,但我閱讀了超級和擴展之間差異的文檔,並在接口中使用它,因爲我希望它們起作用。問題是:爲什麼'Collection >'不接受'IPropertyTranslator ,IElement>'? –

回答

0

該解決方案與「Producer Extends,Consumer Super」規則略有關聯。在問題代碼中,需要將以下標題更改爲以下標題:

public interface IPropertyTranslator<D extends IDataSet<? extends E>, E extends IElement> {} 

public class UniversalPropertyTranslator implements IPropertyTranslator<IDataSet<? extends IElement>, IElement> {} 

並且一切都會正常工作。