2011-12-22 58 views
1

我的問題與here完全相似。就這樣,我想用Java來做。在運行時確定泛型的翻譯類型

假設,我想箱子名單爲:

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

的問題是,什麼a_type會,是一個條件的基礎上決定的。這兩種可能的類型是完全無關的,沒有超類但共同的對象。如果我可以將Type存儲在變量requiredType中並將其作爲List<requiredType>使用,則我的問題將得到解決。我不確定我是否想要這樣貪婪,愚蠢或無知,但這就是情況。

儘管不重要,但解釋了爲什麼我需要它的場景被解釋爲here


PS:請不要提及刪除類型。請考慮現狀。我可以很好地在提問中提到它。如果您認爲有設計問題,請仔細閱讀here的情況並提出替代方案。

+0

這在Java中是不可能的,我甚至會說你的設計有缺陷,如果它需要這個... – 2011-12-22 17:10:06

+0

@JarrodRoberson:請建議你是否有更好的選擇。 「你的設計有缺陷」似乎是這類在互聯網上任何地方發現的問題的最愛。有趣的是,這是一種情況,需要考慮解決方案。 – hkansal 2011-12-22 17:25:22

回答

2

這在Java中是不可能的,因爲類型擦除以及泛型僅限於編譯時間的事實。

例如

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

在編譯時,當類型擦除完成後成爲

List integers = new ArrayList(); 

仿製藥是唯一的方式告訴編譯器,該列表應只涉及Integer類型的對象,和讓我們指出,如果你有某個地方試圖添加其他類型安全以外的東西Integer

0

Java的泛型不是在運行時可用所以不可能用java

搜索「類型擦除」在谷歌,你會更好地理解它。

+0

是的,知道這一點。這就是爲什麼我認爲我可能在這裏有點貪婪。但我想要做的就是以安全的方式初始化我的通用列表。 :( – hkansal 2011-12-22 17:21:33

+0

不幸的是,有沒有辦法:( – fmucar 2011-12-22 17:28:07

0

可以存儲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類型。

2

唯一有效的(如果「冒險」),這樣我可以看到這樣做,將是一個類似於:

 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>() 

編輯我也把回答你的相關的問題,顯示出使用通用接口,用於特殊情況的具體例子。