簡體   English   中英

用於泛型類型的Java轉換“.class”-operator,例如列表,到“Class <List <?>>”和“Class <List <Integer >>”

[英]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>.classList.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);

為什么tListInt2tListGeneric的聲明給出錯誤? 為什么使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM