我无法弄清楚使用泛型执行此操作的正确方法。我有一个类,Foo
它有一个通用的(Foo<class>
)。然后我想要一张地图Map<String, Foo>
。现在,我可以做到这一点,并将其添加Foo<String>
为一个地图项和Foo<Integer>
另一个。但是,当我使用 map 的 get 方法时,我只是得到一个Foo
返回,并且无法再推断类型,所以如果我这样做:
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);
}
}
我不确定这样的最佳做法是什么。有没有人有什么建议?