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