自动转换会有用吗?

时间:2020-03-06 14:24:29  来源:igfitidea点击:

将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,我们可以只声明泛型变量,然后在实例化上使用自动完成功能,它将自动填充我们使用的类型。另外,我们(或者可能更重要的是,其他人)具有的优势是,一眼就能准确地知道列表或者包含的内容。