2016-05-13 138 views
0

之间的区别两个声明之间有什么区别?新ArrayList <String>()和新ArrayList()

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

他们工作,但第二个返回警告。我不明白为什么。

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

+9

它检测到类型,如果你使用''''钻石操作符,像'列表 strings = new ArrayList <>();' – GhostCat

回答

1

在Java 7能够自动检测类型,但你需要使用Diamond Operator

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

它基本上是在第一线的语法糖。没有钻石操作员,这是一个原始类型(非参数化的泛型)。原始类型的存在是为了与不支持泛型的旧Java版本兼容,但会在使用时引发警告。

+2

即使这是真的,它不回答问题:“什么ArrayList arr = new ArrayList ()'和'ArrayList arr = new ArrayList();'?“.. –

+0

@kapep我知道了,但我还是不明白我输了什么,编译器检查条款,编码'ArrayList arr = new ArrayList();'。我的意思是,如果我以这种方式编写'arr.add(arr.get(0))''dosn't不返回错误。 – zer0uno

0

您需要知道,在运行时,所有泛型都将被擦除,因此无论您将什么放入您的<>中,所有ArrayLists的类型都是相同的。

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

1

如前所述,这可以使用<>钻石算子来解决。

但是有理由这样。您必须记住,在收集类别后添加的仿制药。这个想法是他们的泛型不应该破坏现有的源代码。 Sun不希望客户在编译吨位和现有代码时使用未生成列表突然失败...

因此,java编译器必须接受类似... = new ArrayList()的代码。 但重点是,这种声明创建了一个所谓的“原始类型”。

如果可能的话,你永远不应该使用原始类型。这就是为什么日食和javac给你警告 - 提醒你永远不要创建原始类型。