我在尚未在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);
}
}
你可以刪除'extends Data',因爲它是多餘的。 – Njol
這似乎毫無意義,因爲有人可以製作具有通用方法的非泛型類,並且工作得很好。 'T'與'TData'沒有關係,所以沒有理由去除通用信息。這與可變參數一樣愚蠢,因爲人們在引入可變參數之前曾經使用過顯式數組,因此將非限定的'null'視爲空數組而不是'new DataType [] {null}。 – JAB
@ user902383這應該與它無關,參數'T'與'TData'完全無關。 – JAB