将Java编译器更改为自动转换是否存在任何缺点或问题?在下面的示例中,list.get(0)的结果将自动转换为变量hi的类型。
List list = new ArrayList();
list.add("hi");
String hi = list.get(0);
我知道仿制药允许你减少铸造,但他们这样做是以牺牲宣言更加困难为代价的。对我来说,泛型的好处是它们允许你让编译器强制执行更多的规则 - 而不是它们减少了投射(但我没有使用它们,所以我有点不知情)。此提案只会减少要键入的代码量,而不会将其移动到其他位置。 此外,还存在无法使用泛型的情况,因为集合可能具有不同的对象。 如果根据当前使用情况“看起来太令人惊讶”,可能会有语法调整来使用它。
来自:http://jamesjava.blogspot.com/2007/01/automatic-casting.html
答案 0 :(得分:6)
Casting是Java编译器忽略类型安全性的明确指令,因此允许自动强制转换将删除特意设计为该语言的一个特性。
我个人喜欢编译器警告和错误,因为在运行时很难找到这种类型的问题(假设编译器设法将一种对象类型强制转换为另一种对象类型)。
答案 1 :(得分:5)
是的,它会将当前在编译时发现的错误移到运行时找到的错误。虽然一些人认为这不是一个巨大的缺点,但那些人使用的是Python,Ruby或Perl,而不是Java; - )。
答案 2 :(得分:4)
在您的示例中使用泛型的最大好处是它将运行时错误更改为编译时错误。
List list = new ArrayList();
list.add(new Integer(42));
String hi = (String) list.get(0); // run time error
List<String> list = new ArrayList<String>();
list.add(new Integer(42)); // compile time error
String hi = list.get(0);
由于用户可以看到运行时错误,程序员可以看到编译时错误,因此编译时错误要好得多。
要回答您的问题,如果自动生成强制转换,则不会出现任何严重失败(并且在您的示例中仍然会在运行时抛出ClassCastException)。要求明确演员的好处是,它需要编码员思考他正在做什么,并意识到正在进行演员表演。
还有一些情况 泛型不能用,因为a 集合可以有不同的对象
您仍然可以使用通配符向通用集合添加不同的对象。
答案 3 :(得分:1)
我会避免它,因为我有一种感觉它会回来然后咬你。在我看来,仿制药是值得的麻烦,因为它们可以节省很多头痛的麻烦。此外,对于包含不同对象类型的集合,使用“容器”对象并不太难。
答案 4 :(得分:1)
对我来说,好像进行型式检查是件好事。自动转换将删除可能有用的编译时错误。
如果您担心击键次数,您可以使用像Eclipse这样的IDE,可以通过双击插入类型转换。
答案 5 :(得分:0)
正如其他人所说,自动型铸造会消除类型安全性。泛型具有多种好处,实际上并不难以声明。使用Eclipse,您可以只声明泛型变量,然后在实例化时使用自动完成,它将自动填充您使用的类型。此外,您(或者更重要的是,其他人)的优势在于,您可以一眼就知道列表或其他内容的确切内容。