自动转换会有用吗?
将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
解决方案
强制转换是Java编译器忽略类型安全的明确指令,因此允许自动强制转换将删除该语言中专门设计的功能之一。
我个人喜欢编译器警告和错误,因为在运行时发现这种类型的问题要困难得多(假设编译器以某种方式设法将一种对象类型强制转换为另一种类型)。
我会避免的,因为我有一种感觉,它会回来并在以后咬你。在我看来,泛型是值得的麻烦,因为它们可以避免很多麻烦。同样,对于包含不同对象类型的集合使用"容器"对象并不是很困难。
在我看来,进行类型检查是一件好事。自动强制转换将消除潜在的有用的编译时错误。
如果我们担心击键的次数,可以使用Eclipse之类的IDE,前提是可以通过双击插入类型转换。
是的,它将把当前在编译时发现的错误转移到在运行时发现的错误。尽管某些人认为这不是一个巨大的缺点,但那些人使用的是Python,Ruby或者Perl,而不是Java ;-)。
在示例中使用泛型的最大好处是,它将泛型错误从运行时错误转换为编译时错误。
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),则不会有任何严重的失败。要求进行显式强制转换的好处是,它要求编码人员考虑自己在做什么,并意识到强制转换正在发生。
Also there are instances where generics can't be used because a collection can have different object
我们仍然可以使用通配符将不同的对象添加到通用集合中。
正如其他人所说,自动类型转换将消除类型安全性。泛型有很多好处,而且声明起来确实没有什么困难。使用Eclipse,我们可以只声明泛型变量,然后在实例化上使用自动完成功能,它将自动填充我们使用的类型。另外,我们(或者可能更重要的是,其他人)具有的优势是,一眼就能准确地知道列表或者包含的内容。