簡體   English   中英

在運行時確定泛型的轉換類型

[英]Determine translated type for generics at runtime

我的問題與這里的問題完全相似。 就是這樣,我想用Java做。

假設,我想列出一個列表:

List<a_type> myList = new ArrayList<a_type>();

問題是a_type是什么,是根據條件決定的。 兩種可能的類型是完全不相關的,沒有超類但是Object是共同的。 如果我可以將Type存儲在變量requiredType並將其用作List<requiredType>我的問題將得到解決。 我不確定我是不是只是貪婪,愚蠢或無知,但這就是情況。

雖然不重要,但這里解釋了解釋我為什么需要它的場景。


PS:請不要提及類型擦除。 請考慮這種情況。 我可以很好地在問題中提到它。 如果您認為存在設計問題,請仔細閱讀此處的情況並提出替代方案。

這在Java中是不可能的,因為類型擦除並且由於泛型僅限於編譯時間。

例如

List<Integer> integers = new ArrayList<Integer>();

在編譯期間,當完成類型擦除時

List integers = new ArrayList();

泛型只是告訴編譯器的一種方式,列表應該只處理Integer類型的對象,如果你有某個地方試圖為了類型安全而添加除Integer以外的東西,那就讓它指出來。

我能看到的唯一有效(如果“冒險”)方式,將類似於:

     List<?> myList = new ArrayList<?> ();

     /* … */

     final Object o = myList.get (0);

     if (o instanceof OneType) {
           OneType o1 = (OneType)o;
           /* … */
     } else if (o instanceof OtherType) {
           OtherType o2 = (OtherType)o;
           /* … */
     } else {
           throw new RuntimeException ("unexpected type found in list…");
     }

您可能希望使用@SuppressWarnings亂丟該代碼

可能更好(?)的想法是在兩種類型中至少實現“標記接口”(沒有任何方法),並將其用作通用性。

     public interface CanBeAddedToDualTypedList { };
     public class OneType implements CanBeAddedToDualTypeList { … };
     public class OtherType implements CanBeAddedToDualTypeList { … };


     List<CanBeAddedToDualTypedList> myList = 
                     new ArrayList<CanBeAddedToDualTypedList> ()

編輯我還回答了您的相關問題,顯示了針對該特定案例使用通用界面的具體示例。

Java泛型在運行時不可用,因此java無法實現

在谷歌上搜索“類型擦除”,你會更好地理解它。

您可以存儲a_type.class對象,而不會幫助您使用泛型,它可以用於添加額外的運行時類型檢查class.cast(...)

泛型不支持運行時類型,泛型類型本身在運行時不存在。 C#為每個通用類型都有一個運行時類List<String>List<int> 在java中,這不是List<String>List<Integer>在運行時降級為List情況。

AFAIK(從未嘗試過)擴展Generic類存儲類型可以訪問的類型class StringList extends List<String>{} ,StringList記住用於擴展List的Generic類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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