Iva*_*nin 2 java generics types
为什么编译器不会产生任何错误?在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>();
}
}
}
Run Code Online (Sandbox Code Playgroud)
您可以在JLS§4.8中了解这种情况:
原始类型的使用仅允许作为遗留代码兼容性的让步.在将泛型引入Java编程语言之后编写的代码中使用原始类型是非常不鼓励的.未来版本的Java编程语言可能会禁止使用原始类型.
为了确保始终标记可能违反键入规则的行为,对原始类型成员的某些访问将导致编译时未经检查的警告.访问原始类型的成员或构造函数时,编译时未经检查的警告的规则如下:
在对字段的赋值时:如果左侧操作数的类型是原始类型,则如果擦除更改字段的类型,则会发生编译时未经检查的警告.
在调用方法或构造函数时:如果要搜索的类或接口的类型(第15.12.1节)是原始类型,则如果擦除更改方法的任何形式参数类型,则会发生编译时未经检查的警告或构造函数.
当形式参数类型在擦除(即使结果类型和/或throws子句发生更改),从字段读取或创建原始类实例时,方法调用不会发生编译时未经检查的警告类型.
| 归档时间: |
|
| 查看次数: |
116 次 |
| 最近记录: |