Java原始类型声明

Java原始类型声明,java,generics,compilation,compiler-warnings,Java,Generics,Compilation,Compiler Warnings,这个网站上有很多关于Java中原始类型和泛型的问题。即使是关于为什么下一行代码会出现警告的问题: List<String> list = new ArrayList(); 导致第1行出现编译警告,第2行没有编译问题,但第3行出现编译错误-类型安全 因此-将泛型引用添加到第一行(new ArrayList();),只会删除编译器警告 我理解使用原始类型是一个坏习惯,但我的问题是,将右侧写为原始类型有什么区别(编译警告除外) 谢谢 编译器不关心是什么机制创建了变量列表所引用的对象。事实

这个网站上有很多关于Java中原始类型和泛型的问题。即使是关于为什么下一行代码会出现警告的问题:

List<String> list = new ArrayList();
导致第1行出现编译警告,第2行没有编译问题,但第3行出现编译错误-类型安全

因此-将泛型引用添加到第一行(
new ArrayList();
),只会删除编译器警告

我理解使用原始类型是一个坏习惯,但我的问题是,将右侧写为原始类型有什么区别(编译警告除外)


谢谢

编译器不关心是什么机制创建了变量
列表所引用的对象。事实上,它也可以引用
null
。也可以是对方法的调用。例如:

void yourMethod() {
    List<String> list = createStringList();
    ...
}

List<String> createStringList() {
    return new ArrayList(); // raw type here
}

这可以很好地编译,但是警告应该会提醒您,因为稍后可能会出现问题

假设您有另一个类,其中构造函数参数依赖于类型参数:

class Foo<T> {
    Foo(T obj) { }
}
class-Foo{
Foo(T obj){}
}
然后,当您使用类型参数或菱形运算符创建参数类型时,编译器将检查该参数类型:

 Foo<String> bar = new Foo<>(42); // doesn't compile
Foo-bar=新的Foo(42);//不编译
但原始类型会关闭泛型检查:

 Foo<String> bar = new Foo(42); // does compile but causes heap pollution
Foo-bar=新的Foo(42);//不会编译,但会导致堆污染

因此有必要发出警告。

感谢您的回答,以及与其他选项(如
null
或使用方法)的比较。所以我理解——从你回答中的“当有一个合适的…”部分,写
ArrayList()而不是
ArrayList()绝对没有任何意义?(当然一个人应该避免这个习惯,仅仅是为了一个问题)好吧。。。一般来说,您应该避免所有警告(为了尽可能安全)。而且。。。对语句
List List=new ArrayList()
对后面的代码没有任何影响。很好的例子!谢谢
 Foo<String> bar = new Foo<>(42); // doesn't compile
 Foo<String> bar = new Foo(42); // does compile but causes heap pollution