2016-07-21 88 views
4

我有一個泛型類MyClass<T>使用靜態工廠方法和setter方法:Java泛型:不兼容的類型

public class MyClass<T> { 
    public static <T> MyClass<T> with(Context context) { 
     MyClass<T> myClass = new MyClass<>(); 
     myClass.context = context; 
     return myClass; 
    } 
    public void setClass(Class<? extends CustomClass<T>> customClass) { 
     ... 
    } 
    ... 
} 

隨着setter方法,用戶可以設置從「CustomClass」擴展任何類。

到目前爲止這麼好。如果我這樣做:

MyClass<String> myClass = MyClass.with(this); 
myClass.setClass(MyCustomClass.class); 

它完美的工作。但如果我這樣做:

MyClass.with(this).setClass(MyCustomClass.class); 

它不編譯!編譯器輸出:

Error:(44, 87) error: incompatible types: Class<MyCustomClass> cannot be converted to Class<? extends MyCustomClass<Object>> 

我不知道爲什麼它不會編譯第二個選項。 MyCustomClass是這樣的:

public class MyCustomClass extends CustomClass<String> 

回答

5

請注意,你有你的信息,例如工作,並且具有編譯錯誤的一行代碼之間失蹤。

它不知道專業化。你需要做一些像

MyClass.<String>with(this).setClass(MyCustomClass.class); 

所以它知道你會'說話串'它。

+0

感謝你這麼多!它正在工作! –

1

在第二個語句中,您沒有定義類型T,因此編譯器無法編譯,因爲對setClass的限制。

你應該在with功能添加T變量目的:

public static <T> MyClass<T> with(Object context, Class<T> clazz) { 
    MyClass<T> myClass = new MyClass<>(); 
    myClass.context = context; 
    return myClass; 
    } 

MyClass.with(this, String.class).setClass(MyCustomClass.class); 

與否:

MyClass.<String>with(this).setClass(MyCustomClass.class); 
+0

非常感謝你!這個解決方案也適用! –