[英]Is there a clean way to assign the Class of a generic type to a variable?
鑒於此代碼:
List<Integer> ints = new ArrayList<Integer>();
// Type mismatch:
// cannot convert from Class<capture#1-of ? extends List> to Class<List<Integer>>
Class<List<Integer>> typeTry1 = ints.getClass();
// Type safety:
// Unchecked cast from Class<capture#2-of ? extends List> to Class<List<Integer>>
Class<List<Integer>> typeTry2 = (Class<List<Integer>>) ints.getClass();
// List is a raw type. References to generic type List<E> should be parameterized
Class<? extends List> typeTry3 = ints.getClass();
有沒有辦法在沒有錯誤或警告的情況下獲取List<Integer>
的Class
? 我可以很容易地抑制警告,但如果Java要求我禁止對這個有效代碼發出警告,我會非常失望 。
另一方面,如果警告抑制是唯一的方法,最安全的壓制是什么?
這是Java中真正的Catch-22。
如果您沒有向List
添加泛型類型,編譯器會發出警告:
// WARN: List is not typed
Class<? extends List> typeTry3 = ints.getClass();
這是因為,在大多數情況下,最好輸入您的列表。
但是,由於類型擦除,Java無法在運行時找出通用類型的List
,並且編譯器知道這一點。 因此, Class
上沒有返回類型化對象的方法:
// ERROR: ints.getClass() doesn't return a Class<List<Integer>>, it returns a Class<List>
Class<? extends List<? extends Integer>> var = ints.getClass();
因此,您必須將其強制轉換為類型列表。 但是,正如您所知,由於沒有運行時類型檢查,Java會警告您對類型化變量的任何轉換:
// WARN: Casting to typed List
Class<List<Integer>> typeTry2 = (Class<List<Integer>>) ints.getClass();
任何解決這個問題的嘗試本質上都是混淆編譯器的一種方法,並且不可避免地會令人費解。
那么你最好的選擇是選擇B:
另一方面,如果警告抑制是唯一的方法,最安全的壓制是什么?
抑制此警告的最安全方法是使@SuppressWarnings("unchecked")
注釋盡可能本地化。 將它們放在每個未經檢查的演員表上方。 這樣就絕對清楚是誰造成了警告。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.