我无法找出使用泛型执行此操作的正确方法。我有课,Foo
,它有一个通用的( Foo<class>
)。然后我想要一张 Map<String, Foo>
的 map 。现在,我可以这样做,并添加 Foo<String>
作为一个 map 项,并且 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);
}
}
我不确定对于这样的事情最好的做法是什么。有人有什么建议吗?
最佳答案
您似乎在 Map 声明和构造中使用了非泛型 Foo。相反,这个:
Map<String, Foo> mapOfFoo = new HashMap<String, Foo>();
应该是这样的:
Map<String, Foo<String>> mapOfFoo = new HashMap<String, Foo<String>>();
那么您就不必强制转换为 String ——这是首先使用泛型的原因之一,并且 Foo#getValue()
将明确返回一个 String。
关于Java 与泛型混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19613886/