2010-12-16 20 views
7

簡單的設計和簡單的代碼,但不進行編譯:的Java:在採集接口不被識別爲參數

public interface Insertable { 
    public String getInsertStmt(String table); 
} 

public class ClassCanBeInserted implements Insertable { 
    public String getInsertStmt(String table) {} 
} 

public class SomeClass { 
    public static void main() { 
     List<ClassCanBeInserted> list = new ArrayList<ClassCanBeInserted>(); 
     SomeMethod(list); 
    } 
    private static void SomeMethod(List<Insertable> list) {} 
} 

而且調用的someMethod()將無法編譯。英語不好,但代碼應該解釋。有人可以請弄清楚什麼是錯的,以及如何得到一個設計的建議,在這種方法中可以使用接口實現的類的列表?

再說一次,英文差,所以可能表達不好。讓我知道你的問題。謝謝!

錯誤消息給出: 在類型ClassCanBeInserted的方法的someMethod(列表)是不適用的參數(列表)

回答

13

List<Insertable>並不的List<ClassCanBeInserted>類的超類,即使InsertableClassCanBeInserted類的超類。要做你想做的事,你應該改變SomeMethod簽名到SomeMethod(List<? extends Insertable> list)

+0

謝謝!它有效,答案清晰準確。 – 2010-12-16 09:02:23

+0

謝謝,這幫助我解決了我的問題。另外,如果在你的函數中你想聲明一個泛型類型的對象,你可以用'public static void SomeMethod(List list){}'聲明你的函數。然後你可以用'T varName;'來聲明一個該類型的變量。 – 2015-07-09 18:28:21

1

起初這似乎並不直觀。

我想原因是泛型的全部要點是引入和約束基於靜態類型安全的列表。

如果您可以將任何'可插入'放入列表中,那麼您最終可能會混合使用不同類型的混合類型。

這意味着您的獲取將變得不安全並存在ClassCastExceptions的風險。

+0

也可以參見http://stackoverflow.com/questions/2745265/why-arent-javas-generics-implicitly-polymorphic – 2010-12-16 09:34:26