新 ArrayList<String>() 和新 ArrayList() 之间的区别



这两个声明之间有什么区别?

new ArrayList<String>();
new ArrayList();

它们有效,但第二个会返回警告。我不明白为什么。

我理解ArrayList<String> arrArrayList arr之间的区别,第一个启用类型检查控件。但是new ArrayList<String>()new ArrayList()呢?在实现级别上有什么不同吗?在控制方面我会失去什么?

在Java 7中,它可以自动检测类型,但您需要使用Diamond Operator:

ArrayList<String> arr = new ArrayList<>();

这基本上是第一行的句法糖。如果没有菱形运算符,它就是一个原始类型(非参数化的泛型类型)。原始类型的存在是为了与不支持泛型但在使用时会引起警告的旧Java版本兼容。

如前所述,这可以使用<>菱形运算符来解决。

但这是有原因的。你必须记住,泛型在集合类之后添加了。他们的想法是,泛型不应该破坏现有的源代码。孙不希望客户在使用未生成的列表编译大量现有代码时突然失败。。。

因此,java编译器不得不接受... = new ArrayList()这样的代码。但关键是,这种声明创建了一个所谓的"原始类型"。

如果可能的话,你永远不应该使用原始类型。这就是eclipse和javac向您发出警告的原因——提醒您永远不要创建原始类型。

您需要知道,在运行时,所有泛型都会被擦除,这样所有ArrayList都是相同的类型,无论您在<>中放入了什么。

因此,尽管第二行是可能的(由于历史原因,在泛型成为可能之前),但应该避免它,因为它混淆了类型。

最新更新