class SomeClass<E> {
Map<String, String> someMethod();
}
使用
SomeClass a = new SomeClass();
a.someMethod().get("foo") // returns object, not string!
//This code would not even compile
String s = a.someMethod().get("foo");
但如果我从SomeClass中删除泛化(&lt; E&gt;) - 它可以工作。
如果我将此方法提取到接口并在声明中使用接口,它也可以工作:
interface Foo {
Map<String, String> someMethod();
}
class SomeClass implements Foo {
//.....
}
Foo foo = new SomeClass();
String s = foo.someMethod().getString("A");//it works
为什么会这样?我在哪里可以阅读它?什么是最好的解决方案? 感谢。
答案 0 :(得分:10)
解决方案不是让SomeClass
非泛型 - 这是为了避免使用原始类型。例如,这很好用:
import java.util.*;
class SomeClass<E> {
Map<String, String> someMethod() {
return null;
}
}
public class Test {
public static void main(String[] args) {
SomeClass<Integer> a = new SomeClass<Integer>();
String value = a.someMethod().get("foo");
}
}
不可否认,如果您使用原始类型,该方法有效地应用了类型擦除,这有点奇怪 - 但您基本上应该避免这样做。
我目前无法找到有关JLS中原始类型行为的任何解释,但section 4.8确实包含此警告:
原始类型的使用仅允许作为遗留代码兼容性的让步。该 在将通用性引入Java之后编写的代码中使用原始类型 强烈建议不要使用编程语言。未来的版本可能是 Java编程语言将禁止使用原始类型。