为什么编译器不会产生任何错误?在JLS中我可以读到这种情况吗?
class Main {
public static void main(String[] args) {
A a = new A();
List<Integer> list = a.getStrings();
}
static class A<X> {
public List<String> getStrings() {
return new ArrayList<String>();
}
}
}
答案 0 :(得分:5)
您可以在JLS §4.8中了解这种情况:
原始类型的使用仅允许作为遗留代码兼容性的让步。在将泛型引入Java编程语言之后编写的代码中使用原始类型是非常不鼓励的。未来版本的Java编程语言可能会禁止使用原始类型。
为了确保始终标记可能违反键入规则的行为,对原始类型成员的某些访问将导致编译时未经检查的警告。访问原始类型的成员或构造函数时,编译时未经检查的警告的规则如下:
在对字段的赋值中:如果左侧操作数的类型是原始类型,则如果擦除更改字段的类型,则会发生编译时未经检查的警告。
在调用方法或构造函数时:如果要搜索的类或接口的类型(第15.12.1节)是原始类型,则如果擦除更改任何一个,则会发生编译时未经检查的警告方法或构造函数的形式参数类型。
当正式参数类型在擦除下没有变化时(即使结果类型和/或throws子句发生更改),从字段读取或者用于读取时,方法调用都不会发生编译时未经检查的警告类实例创建原始类型。
答案 1 :(得分:2)
这是使用原始类型调用的。出于遗留原因,这是语言,因为泛型并不总是Java的一部分。
由于你不使用泛型类型参数,它只会被删除。正如评论者指出的那样如果在类型擦除后没有指定类型参数,它将是Object
。