Java泛型 - 冗余类型初始化

时间:2015-06-07 03:33:09

标签: java generics

我无法在其他任何地方找到这个确切问题的答案,但如果它重复,我会道歉。

我通常会看到这样的通用初始化,参数类型旁边的类型参数,以及作为对象声明:

Box<Integer> integerBox = new Box<Integer>();

或者,在&#34;短手&#34;方法(自Java 7起),使用菱形:

Box<Integer> integerBox = new Box<>();

但是,我注意到在省略对象声明旁边的参数类型之后代码仍然有用,如下所示:

Box<Integer> integerBox = new Box();

为什么?这是一些编译器吗(顺便说一句,我使用NetBeans)。

提前致谢。

2 个答案:

答案 0 :(得分:1)

这一个:

Box<Integer> integerBox = new Box();

将原始Box分配给integerBox,绕过泛型类型检查。虽然在这种情况下看起来可能很好,但是当你有像

这样的东西时,它并不是那么好
List<String> strings = Arrays.asList("a", "b", "c");
...
List<Integer> integers = new ArrayList(strings);

如果你这样做

List<Integer> integers = new ArrayList<>(strings);

然后编译器将检测到类型不匹配。

答案 1 :(得分:0)

如果你编译它,你会得到一个warning: unchecked conversion。这意味着,当您将integerBox初始化为原始类型时,即使它被声明为泛型类型,编译器仍将绕过泛型类型检查。