2015-07-06 51 views
1

爲什麼這個泛型引用不能指向Java中這個類似的擴展類?爲什麼這個泛型引用不能指向Java中這個類似的擴展類?

http://goo.gl/evqOcP

public class HelloWorld{ 

    public static void main(String []args){ 

     Interface<Integer,Object> test = new Test(); 

     System.out.println(test.method(test)); 
    } 
} 


public interface Interface<A, B extends Object> { 
    public A method(B param); 
} 

public class Test implements Interface<Integer,Test> { 
    private int a = 0; 

    public Integer method(Test param){ 
     return param.a; 
    } 
} 

編譯時出現此錯誤

HelloWorld.java:5: error: incompatible types                               
     Interface<Integer,Object> test = new Test();                             
             ^                               
    required: Interface<Integer,Object>                                 
    found: Test                                      
1 error 

回答

2

Test類實現Interface<Integer,Test>,類型聲明爲Interface<Integer,Object>。此作業是不允許的,因爲泛型是invariant

Interface<Integer,Test>既不是子類型也不是超類型Interface<Integer,Object>。所以,Interface<Integer,Test>不能被分配到Interface<Integer,Object>

您可以更改賦值語句如下,使其工作:

Interface<Integer, ? extends Test> test = new Test();

4

Test類實現Interface<Integer,Test>,但你聲明爲Interface<Integer, Object>類型,因此類型不匹配的。

您可以更改參考/分配:

Interface<Integer, Test> test = new Test(); 

另外請注意,您將無法在test調用method(test),因爲該方法採用Test參數,而不是一個Interface<...>說法。

+0

編輯已完成,因此錯誤不同。 – pdem

+0

@pdem你指的是什麼編輯?我仍然看到*不兼容的類型* ... – Mena

+0

好吧我認爲接口的聲明已經改變,因爲「擴展對象」沒有興趣的行「公共接口接口 {」 – pdem

1

它這樣想,假設class Animalclass Dog extends Animalclass Elephant extends Animal

現在你有一個狗窩,你可以適合狗,List<Dog> kennel和 你有一個動物園:List<Animal> zoo

狗窩是一種動物園嗎?不,你不能add大象到狗窩。

動物園是一種犬舍嗎?不,你不能確保它只會返回狗,當你從它get

正如在其他答案中提到的那樣,兩個通用容器之間沒有子類型關係,因此分配失敗。

相關問題