![](/img/trans.png)
[英]How to call .class for a class with type parameter? E.g. List<String>.class
[英]Java casting “.class”-operator used on a generic type, e.g. List, to “Class<List<?>>” and to “Class<List<Integer>>”
我使用.class
-operator將有關包含類型的信息提供給泛型類。 對於非泛型包含的類型,例如Integer.class
,這沒有任何問題。 但是包含的類型是通用的,例如List<Integer>.class
或List.class
它會導致關於類轉換的編譯時錯誤。
有辦法規避錯誤,但我很好奇這里發生了什么。 有人可以解釋發生了什么嗎?為什么事情就像它們一樣?以及解決問題的最佳方法是什么?
以下行演示了此問題:注意外部泛型類型需要Class<T>
作為參數,因此在本例中為Class<List<Integer>>
。
Class<Integer> tInt = Integer.class; // Works as expected.
Class<List> tList = List.class; // Works with warning, but is not
// what i'm looking for.
Class<List<Integer>> tListInt1 = List.class; // Error
Class<List<Integer>> tListInt2 = (Class<List<Integer>>) List.class; // Error
Class<List<?>> tListGeneric = (Class<List<Integer>>) List.class; // Error
下一行有效:
Class<List<Integer>> tListInt3 =
(Class<List<Integer>>) ((Class<Integer>)List.class);
為什么tListInt2
和tListGeneric
的聲明給出錯誤? 為什么使用tListInt3
然后向下轉換不會產生錯誤? 有沒有更好的方法來聲明tListInt3
?
親切的問候,
Kasper van den Berg
PS。 如果您希望將代碼視為需要此類型信息的外部通用容器,請告訴我們。 如果需要,我會發布它。
Class<List<Integer>> tListInt3 =
(Class<List<Integer>>) ((Class<Integer>)List.class);
這不起作用。 你可能意味着
Class<List<Integer>> tListInt3 =
(Class<List<Integer>>) ((Class)List.class);
我們總是可以通過向上投射然后向下投射從一種類型轉換為另一種類型
Integer x = (Integer)(Object)"string";
List.class
的類型是Class<List>
; 它不是Class<List<Whatever>>
的子類型/超類型,因此兩種類型之間的直接轉換是非法的。
可以說Class<List<Integer>>
不存在 - List
只有一個類; List<Integer>
沒有這樣的類(在運行時它真的只是List
)
但是,這是Java類型系統的缺陷; 在實踐中,我們確實需要Class<List<Integer>>
東西。 我們的解決方案 - 鑄造和假裝Class<List<Int>>
退出 - 同樣存在缺陷 - 但這不是我們的錯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.