2014-01-22 45 views
0

我在尚未在stackoverflow中討論過的條件(例如Why won't this generic java code compile?)中出現「不兼容類型」編譯器錯誤。Java泛型和不兼容的類型:編譯器中的錯誤?

我的期望很簡單 - 我調用了一個模板化方法,它不使用任何包含類的「泛型」類,因此它應該從方法參數中提取模板參數的類型,並且這應該在所有情況下進行編譯 - 但是我獲取「不兼容類型」編譯器錯誤。

我注意到奇怪的方法來解決這個問題 - 在方法參數中將「<?extends Data>」添加爲通用數據類型。它如何改變編譯器邏輯?

在我的理解 - 應該有,因爲(1)DataContainer類的模板的參數還沒有方法調用和(2)限制‘< TDATA延伸數據>’已經定義了最小化的基本對象類沒有使用差 - 數據 - 因此在編譯沒有參數的模板時應該自動假定它。

public void processData(DataContainer<? extends Data> c) { 

(顯式類型轉換可以用,但我相信它是在這裏冗餘)

DummyContextClass dcc = (DummyContextClass)c.getContext(DummyContextClass.class); 

代碼複製/粘貼

public class Test { 

    public static class Data { 
    } 

    public static class DataContainer<TData extends Data> { 
     public final TData Data; 
     private final Map<String, Object> contexts = new HashMap<>(); 

     public DataContainer(TData data) { 
      Data = data; 
     } 

     public <T> T getContext(Class<T> type) { 
      return (T)contexts.get(type.getName()); 
     } 

     public <T> void setContext(Class<T> type, T context) { 
      contexts.put(type.getName(), context); 
     } 
    } 

    public static class DummyContextClass { 
    } 

    public void processData(DataContainer c) { 
     c.setContext(DummyContextClass.class, new DummyContextClass()); 

     // error: incompatible types: Object cannot be converted to DummyContextClass 
     DummyContextClass dcc = c.getContext(DummyContextClass.class); 
    } 
} 

回答

6

問題無關(遠)至用你的通用方法做。
你的問題是你使用的是原始類型作爲方法的參數:

public void processData(DataContainer c) { // Oops! DataContainer is a raw type 

你應該使用的參數與DataContainer

public void processData(DataContainer<? extends Data> c) { 

當你離開過的類型通用類,你有什麼叫原始類型,和(由於兼容性要求與舊Java版本),所有通用信息被剝離類。這(其中包括)更改聲明爲泛型類型爲Object所有返回類型,所以編譯的目的,你的方法現在看起來像:

public Object getContext(Class type) { 

...因此你的錯誤。

+1

你可以刪除'extends Data',因爲它是多餘的。 – Njol

+0

這似乎毫無意義,因爲有人可以製作具有通用方法的非泛型類,並且工作得很好。 'T'與'TData'沒有關係,所以沒有理由去除通用信息。這與可變參數一樣愚蠢,因爲人們在引入可變參數之前曾經使用過顯式數組,因此將非限定的'null'視爲空數組而不是'new DataType [] {null}。 – JAB

+0

@ user902383這應該與它無關,參數'T'與'TData'完全無關。 – JAB