2
我有一個程序需要接受只有在運行時才知道類類型的對象。我想知道是否有可能讓程序自動將對象轉換回正確的類類型?自動類型鑄造
以下代碼是我目前擁有的;我將解釋什麼我希望它做的一步一步:
- 創建
TryingSomething
例如,增加了兩套(類類型Foo
之一,類類型Bar
之一)。 - 該集應該被添加到散列映射。在這一點上,我已經從Eclipse獲得了一個警告,並警告我這些套件在某種程度上不兼容。雖然類型是相同的。這裏出了什麼問題?
- 繼續前進,假設上一步按預期工作。我希望再次檢索主方法中的集合,但已經轉換爲正確的類類型(
Foo
和Bar
)。這會工作嗎?如果沒有,是否有替代方案允許我將對象恢復爲正確的類類型? - (獎金)爲了讓我區分不同的類類型,引入了與每個集合相關的名稱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{
}
對於初學者:'addCollection'被聲明爲一個通用方法,定義一個自己的'T'。這個'T'與'T'類不一樣,因此是錯誤信息。在開始時刪除'',你不需要它。 –
eran
我現在無法發佈完整答案,但只是想一想:假設您使用用戶提供的字符串替換了getCollection調用中的字符串。編譯器無法預測該值會是什麼。編譯器如何知道你的代碼不會中斷? (這是**不是**問題本身,只是暗示你正在嘗試做的事情沒有意義,因爲它是......) – Amit
@eran我編輯了你給我的建議。錯誤在'test()'方法中移到了兩個addCollection/2調用中。我決定將這些信息移動到主要方法中,以使其更易讀(並移除'test()'方法),但在主要方法中,它不會給我任何錯誤。這很奇怪。 – Babyburger