gpt4 book ai didi

java - 如果在集合实例化期间未指定类型参数之一,会发生什么情况?

转载 作者:行者123 更新时间:2023-12-02 00:41:26 25 4
gpt4 key购买 nike

Java中集合的实例化通常如下:

ArrayList<Integer> ali = new ArrayList<Integer>();

据说,按照这个约定,某些错误例如

String s = (String)ali(0)

可能导致编译错误而不是运行时异常。

但是,我观察到,虽然

ArrayList ali = new ArrayList<Integer>();

会导致上面的情况引起运行时异常,

ArrayList<Integer> ali = new ArrayList();

上述情况仍然会导致编译时错误。

是否有什么我错过的,或者如果我们不关心代码的清晰度,我们可以忽略右侧的类型吗?

谢谢!

最佳答案

ArrayList<Integer> ali = new ArrayList();

ArrayList ali = new ArrayList<Integer>();

这将生成一个编译器警告:未检查的转换。如果您不忽略这些警告,或者使用注释抑制它们,因为您可以证明它是安全的,那么您只能获得泛型的编译安全性。

您提出了一个有趣的观点:

ArrayList<Integer> ali = new ArrayList();

由于您只会使用 ali,因此您的引用确实安全。但是,您将在表达式的右侧收到编译器警告,因此最好添加参数化类型并使编译器免受警告。编译器警告您的原因是因为有人可能会这样做:

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

哦,不,你现在已经在整数中添加了字符串!

这就是 Java 7 类型推断的用武之地

ArrayList<Integer> ali = new ArrayList<>();

因此不再需要指定参数化类型,因为 Integer 是推断出来的。您可以在 Java 5 或 6 中通过编写一个泛型方法(例如 makeArrayList())来推断类型(请参阅 Joshua Bloch effective Java 书)

关于java - 如果在集合实例化期间未指定类型参数之一,会发生什么情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6279833/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com