我的問題可以概括式的這個片段:泛型和鑄造到正確的類型
public interface TheClass<T> {
public void theMethod(T obj);
}
public class A {
private TheClass<?> instance;
public A(TheClass<?> instance) {
this.instance = instance;
}
public void doWork(Object target) {
instance.theMethod(target); // Won't compile!
// However, I know that the target can be passed to the
// method safely because its type matches.
}
}
我A
類使用的TheClass
一個實例,其泛型類型不明。它具有一個方法,目標傳遞爲Object
,因爲TheClass
實例可以用任何類進行參數化。但是,編譯器不會讓我像這樣傳遞目標,這是正常的。
我該怎麼辦才能繞過這個問題?
髒的解決方案是聲明實例爲TheClass<? super Object>
,它工作正常,但在語義上是錯誤的...
另一種解決方案我使用之前是聲明實例爲原料的類型,只是TheClass
,但它是壞的練習,所以我想糾正我的錯誤。
解
public class A {
private TheClass<Object> instance; // type enforced here
public A(TheClass<?> instance) {
this.instance = (TheClass<Object>) instance; // cast works fine
}
public void doWork(Object target) {
instance.theMethod(target);
}
}
你爲什麼不還鍵入'A'? – 2012-03-20 10:15:45
+1,一個很好的問題!等待答案...... – aProgrammer 2012-03-20 10:17:38
A是我製作的開源庫的一部分,許多人都使用它,而打字A意味着強大的api突破。最近我發現了這個問題,因爲之前我使用原始類型爲「TheClass」實例,因爲我不知道這是一個糟糕的概念。它工作得很好,但被認爲是不好的做法,所以我想糾正這種誤用。 – 2012-03-20 10:19:06