在没有定义类型的情况下使用泛型类时没有错误

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)

ars*_*jii 5

您可以在JLS§4.8中了解这种情况:

原始类型的使用仅允许作为遗留代码兼容性的让步.在将泛型引入Java编程语言之后编写的代码中使用原始类型是非常不鼓励的.未来版本的Java编程语言可能会禁止使用原始类型.

为了确保始终标记可能违反键入规则的行为,对原始类型成员的某些访问将导致编译时未经检查的警告.访问原始类型的成员或构造函数时,编译时未经检查的警告的规则如下:

  • 在对字段的赋值时:如果左侧操作数的类型是原始类型,则如果擦除更改字段的类型,则会发生编译时未经检查的警告.

  • 在调用方法或构造函数时:如果要搜索的类或接口的类型(第15.12.1节)是原始类型,则如果擦除更改方法的任何形式参数类型,则会发生编译时未经检查的警告或构造函数.

  • 当形式参数类型在擦除(即使结果类型和/或throws子句发生更改),从字段读取或创建原始类实例时,方法调用不会发生编译时未经检查的警告类型.