2017-01-07 167 views
2

我有一個程序需要接受只有在運行時才知道類類型的對象。我想知道是否有可能讓程序自動將對象轉換回正確的類類型?自動類型鑄造

以下代碼是我目前擁有的;我將解釋什麼我希望它做的一步一步:

  1. 創建TryingSomething例如,增加了兩套(類類型Foo之一,類類型Bar之一)。
  2. 該集應該被添加到散列映射。在這一點上,我已經從Eclipse獲得了一個警告,並警告我這些套件在某種程度上不兼容。雖然類型是相同的。這裏出了什麼問題?
  3. 繼續前進,假設上一步按預期工作。我希望再次檢索主方法中的集合,但已經轉換爲正確的類類型(FooBar)。這會工作嗎?如果沒有,是否有替代方案允許我將對象恢復爲正確的類類型?
  4. (獎金)爲了讓我區分不同的類類型,引入了與每個集合相關的名稱String。如果可以在步驟3中實現結果,而不需要字符串,則會更好。

感謝任何人誰可以給我一些指針。

class TryingSomething<T> { 
    private Map<String, Set<T>> map = new HashMap<String, Set<T>>(); 

    public void addCollection(Set<T> s, String name){ 
     this.map.put(name, s); 
    } 

    public void test(){ 
     Set<Foo> foo = new HashSet<Foo>(); 
     Set<Bar> bar = new HashSet<Bar>(); 
     addCollection(foo, "foo"); 
     addCollection(bar, "bar"); 
    } 

    public Set<T> getCollections(String name){ 
     return this.map.get(name); 
    } 

    @SuppressWarnings("unchecked") 
    public static void main(String[] args){ 
     TryingSomething t = new TryingSomething(); 
     Set<Foo> foo = new HashSet<Foo>(); 
     Set<Bar> bar = new HashSet<Bar>(); 
     t.addCollection(foo, "foo"); 
     t.addCollection(bar, "bar"); 
     Set<Foo> fooList = t.getCollections("foo"); 
     Set<Bar> barList = t.getCollections("bar"); 
    } 

} 

class Foo{ 
} 

class Bar{ 
} 
+0

對於初學者:'addCollection'被聲明爲一個通用方法,定義一個自己的'T'。這個'T'與'T'類不一樣,因此是錯誤信息。在開始時刪除'',你不需要它。 – eran

+1

我現在無法發佈完整答案,但只是想一想:假設您使用用戶提供的字符串替換了getCollection調用中的字符串。編譯器無法預測該值會是什麼。編譯器如何知道你的代碼不會中斷? (這是**不是**問題本身,只是暗示你正在嘗試做的事情沒有意義,因爲它是......) – Amit

+0

@eran我編輯了你給我的建議。錯誤在'test()'方法中移到了兩個addCollection/2調用中。我決定將這些信息移動到主要方法中,以使其更易讀(並移除'test()'方法),但在主要方法中,它不會給我任何錯誤。這很奇怪。 – Babyburger

回答

1

您可以使用類的類對象(運行時類型)爲您的地圖項:

class TryingSomething { 
    private Map<Class<?>, Set<?>> map = new HashMap<>(); 

    public <T> void addCollection(Set<T> s, Class<T> clazz){ 
     map.put(clazz, s); 
    } 

    public void test(){ 
     Set<Foo> foo = new HashSet<Foo>(); 
     Set<Bar> bar = new HashSet<Bar>(); 
     addCollection(foo, Foo.class); 
     addCollection(bar, Bar.class); 
    } 

    @SuppressWarnings("unchecked") 
    public <T> Set<T> getCollections(Class<T> clazz){ 
     return (Set<T>)this.map.get(clazz); 
    } 


    public static void main(String[] args){ 
     TryingSomething t = new TryingSomething(); 
     Set<Foo> foo = new HashSet<Foo>(); 
     Set<Bar> bar = new HashSet<Bar>(); 
     t.addCollection(foo, Foo.class); 
     t.addCollection(bar, Bar.class); 
     Set<Foo> fooList = t.getCollections(Foo.class); 
     Set<Bar> barList = t.getCollections(Bar.class); 
    } 

} 

class Foo{ 
} 

class Bar{ 
} 

類,因爲要存儲組任意類型的TryingSomething不應該是通用的(在運行時動態選擇)。請注意,此實現不檢查插入的集合是否實際上包含指定類型的對象(既不是插入也不是檢索) - 此容器類的用戶的責任在於此。

+0

這似乎工作正常。謝謝! – Babyburger