这两个声明有什么区别?
new ArrayList<String>();
new ArrayList();
他们工作,但第二个返回警告。我不明白为什么。
我理解ArrayList<String> arr
和ArrayList arr
之间的区别,第一个启用了类型检查控件。但是new ArrayList<String>()
和new ArrayList()
呢?实施水平有什么不同吗?在控制方面我会失去什么?
答案 0 :(得分:1)
在Java 7中,它可以自动检测类型,但您需要使用Diamond Operator:
ArrayList<String> arr = new ArrayList<>();
第一行基本上是语法糖。没有菱形算子,它是原始类型(非参数化泛型类型)。存在原始类型以与较旧的Java版本兼容,这些Java版本不支持泛型,但在使用时会引发警告。
答案 1 :(得分:1)
如前所述,可以使用<>
菱形运算符解决此问题。
但是有理由这样做。你必须记住在集合类之后添加 的泛型。而这个想法是他们的泛型不应该破坏现有的源代码。 Sun并不希望客户在使用未经广泛的列表编译大量现有代码时会突然失败...
因此java编译器必须接受像... = new ArrayList()
这样的代码。
但重点是,这种宣言创造了一种所谓的原始类型&#34;。
如果可能的话,你永远不应该使用原始类型。这就是为什么eclipse和javac会给你警告 - 提醒你永远不要创建原始类型。
答案 2 :(得分:0)
您需要知道在运行时,所有泛型都会被删除,因此所有ArrayLists都属于同一类型,无论您放入&lt;取代。
因此虽然第二行是可能的(出于历史原因,在可能存在泛型之前),但应该避免它,因为它会混淆类型。