2012-03-20 50 views

回答

6

<T>告訴Java,它是一個通用的方法,它定義了自己的類型參數,而不是依賴整個類定義的類型參數。

public class Stuff<T> {}

2

它並不能真正幫助的。

在呼叫站點,它允許您使用任何類型參數將結果指定給List,該類型參數不是非常類型安全的。所有這些代碼只會給你帶來虛假的安全感。如果它返回,例如,List<String>然後按照書面,您將被允許將該結果分配給List<Integer>,並且直到很久以後(當您嘗試訪問List的某個元素以及將它分配給Integer),並且隱含的演員陣陣在你的臉上。通常,如果一個通用的方法(例如,一個具有與它所屬的類相分離的類型參數的方法)只使用其類型參數一次和/或僅將其用於返回值,那麼這是一個完全浪費的時間!

+0

不幸的是,這是處理舊的API返回純'List'最少痛苦的方式,但你_know_,這真的返回'列表'。 – mitchnull 2012-03-20 09:08:52

+0

我同意@mitchnull。在這裏遇到同樣的事情:http://stackoverflow.com/questions/115692/how-to-avoid-type-safety-warnings-with-hibernate-hql-results和感謝對這裏發生了什麼的洞察! – brainydexter 2012-03-20 09:15:48

+0

這可能是唯一有效的用法 – dty 2012-03-20 09:18:20

0

這就是告訴java那個listAndCast是一個依賴於T類型的通用方法。

側面說明:我喜歡這個實現了這個問題,因爲它是更通用:

@SuppressWarnings("unchecked") 
public <T> List<T> list_cast(List<?> orig) { 
    return (List<T>)orig; 
} 
+0

碰到這個,並認爲你可能會感興趣:http://stackoverflow.com/a/115952/280924 – brainydexter 2012-03-20 09:09:38

0

你不需要<T>,但它確實停止編譯器警告。編譯器會推斷將返回一個List<Object>(它沒有關於將返回的類型的其他信息)。

它本質上是一樣的:

public static List listAndCast(Query query) 

沒有關於原始類型的警告。

<T>如果傳遞的參數與參數<T>,可能是有用的。例如:

public static <T> List<T> listAndCast(Query<T> query) 
+0

如果你不通過類型,你如何知道轉換的目標類型論據? – Gabber 2012-04-24 10:37:41

相關問題