我无法在其他任何地方找到这个确切问题的答案,但如果它重复,我会道歉。
我通常会看到这样的通用初始化,参数类型旁边的类型参数,以及作为对象声明:
Box<Integer> integerBox = new Box<Integer>();
或者,在&#34;短手&#34;方法(自Java 7起),使用菱形:
Box<Integer> integerBox = new Box<>();
但是,我注意到在省略对象声明旁边的参数类型之后代码仍然有用,如下所示:
Box<Integer> integerBox = new Box();
为什么?这是一些编译器吗(顺便说一句,我使用NetBeans)。
提前致谢。
答案 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
初始化为原始类型时,即使它被声明为泛型类型,编译器仍将绕过泛型类型检查。