2016-03-09 17 views
1

如何在下面的代碼中刪除警告Unchecked overriding: return type requires unchecked conversion. Found 'org.example.AAndB<java.lang.integer>', required 'T'.類型參數範圍 - 取消選中覆蓋:返回類型需要非選中轉換

我嘗試這樣一種方式,它不會明確說明方法get()AAndB<Integer>)的返回類型,而是枚舉接口的結果必須實現(<T extends B<Integer> & A> T)來設計的接口(Interface)。

package org.example; 

class InterfaceImpl implements Interface { 

    public AAndB<Integer> get() { 
     // ^----- Unchecked overriding: return type requires unchecked conversion. Found 'org.example.AAndB<java.lang.integer>', required 'T'. 
     final AAndB<Integer> aAndB = new AAndB<Integer>(); 
     return aAndB; 
    } 
} 

interface Interface { 
    <T extends B<Integer> & A> T get(); 
} 

class AAndB<T> implements A, B<T> { 

    public void a() { 

    } 

    public void b(T t) { 

    } 
} 

interface A { 
    void a(); 
} 

interface B<T> { 
    void b(T t); 
} 
+0

我發現相關問題[如何引用具有多個邊界的泛型返回類型](http://stackoverflow.com/questions/14464226/how-to-reference-a-generic-return-type-with-multiple-邊界)與全面的[答案](http://stackoverflow.com/a/14469627/639687)。 – czerny

回答

1

我們可以清楚地看到,你實現的方法簽名不通過方法定義的簽名Interface匹配:

public AAndB<Integer> get() 

是不一樣的

public <T extends B<Integer> & A> T get() 

T的定義是方法簽名的一部分。爲了符合Interface.get,你需要寫:

class InterfaceImpl implements Interface { 
    public <T extends B<Integer> & A> T get() { 
     // ... 
    } 
} 

在接口中的方法簽名界仿製藥並不意味着可以替代任何類型的在於你自己的實現方法的範圍內。

如果你希望能夠指定不同的返回類型,需要進行參數Interface

class InterfaceImpl implements Interface<AAndB<Integer>> { 

    public AAndB<Integer> get() { 
     final AAndB<Integer> aAndB = new AAndB<Integer>(); 
     return aAndB; 
    } 
} 

interface Interface<T extends B<Integer> & A> { 
    T get(); 
} 
+0

請您詳細說明爲什麼最初的'InterfaceImpl'實際上並沒有實現'Interface'? – czerny

+0

更新了更多細節。 – VGR

0

你完全誤解了什麼<T extends B<Integer> & A> T get();手段。

<T extends B<Integer> & A> T get();聲明瞭一個通用方法。這意味着該方法必須能夠與任何T正確工作 - 它必須正確地與T正常工作,無論任何呼叫者可能需要T,無需知道什麼是T

這並不意味着該方法可以選擇T是它想要的。恰恰相反。該方法沒有選擇,並且必須與爲其選擇的任何T一起工作。