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

时间:2013-08-21 14:55:54

标签: 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>();
    }
  }
}

2 个答案:

答案 0 :(得分:5)

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

  

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

     

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

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

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

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

  •   

答案 1 :(得分:2)

这是使用原始类型调用的。出于遗留原因,这是语言,因为泛型并不总是Java的一部分。

由于你不使用泛型类型参数,它只会被删除。正如评论者指出的那样如果在类型擦除后没有指定类型参数,它将是Object