第一个例子是正确的,你提供所需的一切。但它也意味着您重复参数类型的定义。
然后,在Java 1.7(或者1.8,不太清楚),他们推出的缩短版 - 所以,如果你定义ArrayList<Integer> numbers
,没有必要定义再讲ArrayList
为Integer
应创建并只需保持<>
那里。这有时称为菱形符号并指示编译器使用与字段定义相同的数据类型。因此,它的行为与第一个例子完全相同,但不需要复制有关数据类型的信息。
您创建的ArrayList
没有指定的数据类型,您在那里的最后一种情况有所不同。这可能有点危险,因为它允许你写下面的代码:
List listAnything = new ArrayList();
listAnything.add("string");
listAnything.add(42);
listAnything.add(false);
List<Integer> listInteger = listAnything;
以上列举的代码编译完全正常,但大约有选中转换和使用原始类型一些警告。您不再保证listInteger
仅包含整数。
此外,在这里警告的话 - 你应该尽可能在你的代码中依赖抽象。通过这个我的意思是定义你的领域使用一个接口或抽象类而不是具体的。这样的代码显着更好地阅读和维护:
ArrayList<Integer> list = new ArrayList<>(); // this is not wrong...
List<Integer> list = new ArrayList<>(); // ...but this is better
你的第一个和第二个例子看起来是一样的吗? – snozza
我的不好,纠正了我的问题。 – SJ19
关于第三个选项:请参阅[什么是原始类型,为什么我们不应该使用它?](http://stackoverflow.com/questions/2770321/what-is-a-raw-type-and-why-请勿使用-123)请拨打 – Jesper