这两个声明之间有什么区别?
new ArrayList<String>();
new ArrayList();
它们有效,但第二个会返回警告。我不明白为什么。
我理解ArrayList<String> arr
和ArrayList arr
之间的区别,第一个启用类型检查控件。但是new ArrayList<String>()
和new ArrayList()
呢?在实现级别上有什么不同吗?在控制方面我会失去什么?
在Java 7中,它可以自动检测类型,但您需要使用Diamond Operator:
ArrayList<String> arr = new ArrayList<>();
这基本上是第一行的句法糖。如果没有菱形运算符,它就是一个原始类型(非参数化的泛型类型)。原始类型的存在是为了与不支持泛型但在使用时会引起警告的旧Java版本兼容。
如前所述,这可以使用<>
菱形运算符来解决。
但这是有原因的。你必须记住,泛型在集合类之后添加了。他们的想法是,泛型不应该破坏现有的源代码。孙不希望客户在使用未生成的列表编译大量现有代码时突然失败。。。
因此,java编译器不得不接受... = new ArrayList()
这样的代码。但关键是,这种声明创建了一个所谓的"原始类型"。
如果可能的话,你永远不应该使用原始类型。这就是eclipse和javac向您发出警告的原因——提醒您永远不要创建原始类型。
您需要知道,在运行时,所有泛型都会被擦除,这样所有ArrayList都是相同的类型,无论您在<>中放入了什么。
因此,尽管第二行是可能的(由于历史原因,在泛型成为可能之前),但应该避免它,因为它混淆了类型。