我無法弄清楚用泛型做到這一點的正確方法。我有一個類,Foo
,它有一個通用的(Foo<class>
)。然後我想要有一張Map<String, Foo>
的地圖。現在,我可以做到這一點,並將Foo<String>
添加爲一個地圖項目,並將Foo<Integer>
添加爲另一個地圖項目。然而,當我使用地圖的get方法,我只是得到一個Foo
背部和類型可以不再被推斷,所以,如果我做的:Java與泛型混淆
String s = map.get("StringFoo")
我得到一個編譯錯誤,必須做到:
String s =(String)map.get(「StringFoo」)
什麼是一種好的模式來做這樣的事情來避免投射,因爲這就是泛型所要做的。我可能能夠做到像Map<String, Foo<?>>
這樣的事情,但那是做到這一點的方式嗎?
我的代碼的詳細信息如下,這可以放在一個目錄中,javac *.java && java Main
將運行它。
我在Foo.java一個通用的Java類,
public class Foo<T>
{
T value;
public T getValue()
{
return this.value;
}
public void setValue(T t)
{
this.value = t;
}
}
現在,我已經在Main.java以下測試類:
import java.util.Map;
import java.util.HashMap;
public class Main
{
public static void main(String[] a)
{
Foo<String> fooStr = new Foo<String>();
fooStr.setValue("TEST 123");
Foo<Integer> fooInt = new Foo<Integer>();
fooInt.setValue(314159);
Map<String, Foo> mapOfFoo = new HashMap<String, Foo>();
mapOfFoo.put("Strings", fooStr);
mapOfFoo.put("Integer", fooInt);
System.out.println("All set");
String s = mapOfFoo.get("Strings").getValue();
System.out.println("Got: " + s);
}
}
當我編譯此,我得到的以下錯誤:
Main.java:21: error: incompatible types
String s = mapOfFoo.get("Strings").getValue();
^
required: String
found: Object
1 error
當我這樣做是Main.java,它的工作原理:
import java.util.Map;
import java.util.HashMap;
public class Main
{
public static void main(String[] a)
{
Foo<String> fooStr = new Foo<String>();
fooStr.setValue("TEST 123");
Foo<Integer> fooInt = new Foo<Integer>();
fooInt.setValue(314159);
Map<String, Foo> mapOfFoo = new HashMap<String, Foo>();
mapOfFoo.put("Strings", fooStr);
mapOfFoo.put("Integer", fooInt);
System.out.println("All set");
String s = (String)mapOfFoo.get("Strings").getValue();
System.out.println("Got: " + s);
}
}
我不確定最佳做法是什麼樣的。有沒有人有什麼建議?
好的,我的代碼在開始時變得糟糕透露,因爲它剝離了我的>和<標籤中的一些,但示例代碼應該得到跨越的點 – mikeb
只需使用四空間縮進;普通尖括號可以正常工作。 – chrylis