2013-04-04 23 views
1

我想在java中使用泛型方法第一次。它不工作,而且在我看來,Java泛型並不意味着以這種方式使用 - 我需要實現一個通用接口,而不是使用泛型方法。請確認(或否認)該結論。在Java中使用泛型方法參數

這就是我想要做的事:

public <T> void updateItem(T item) { 
    String itemKey = item.getKey(); 
    ... 

這給我的錯誤「的方法信息getKey()是未定義的類型T」。

尋找爲什麼這不起作用,我看到類型擦除「如果類型參數是無界的,則用泛界限或對象替換泛型中的所有類型參數」。

我可以'綁定'我的類型T的唯一方法是如果我爲所有我打算使用的類型創建一個公共子類或接口,並且如果我這樣做,那麼我可以使用多態而不是泛型。

+0

看起來你想使用一個接口,而不是泛型。 – svz 2013-04-04 17:06:27

+1

T應該是什麼?你可以使用'' – Supericy 2013-04-04 17:06:27

+0

我有這個想法(來自Python或C++),我不必指定T是什麼。當使用類型調用T時,T將被類型檢查。 – Tom 2013-04-04 17:07:45

回答

5

這是正確的。方法getKey()未在類T中定義。但是,如果將您的方法定義如下:

public <T extends Entry> void updateItem(T item) { 
    String itemKey = item.getKey(); 

編譯器可以找到getKey()方法。請注意,我用<T extends Entry>(我的意思是​​)。這個類有方法getKey()和編譯器可以解決它。

+0

是的,我有這個想法(從Python和C++),編譯器不會試圖解析調用,直到調用(或Python中的運行時),只要它按照使用方式工作就沒問題。 – Tom 2013-04-04 17:10:57

+0

對我而言,奇怪的是,如果T有一個共同的基類(上面的Entry),那麼我根本不需要泛型。 – Tom 2013-04-04 17:12:09

+1

@Tom這是正確的 - 只需要以'Entry'爲例。有時多態足夠了,你不需要泛型。 – 2013-04-04 17:13:14