-2

将 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

4

6 回答 6

6

强制转换是 Java 编译器忽略类型安全的显式指令,因此允许自动强制转换将删除特意为该语言设计的功能之一。

我个人喜欢编译器警告和错误,因为在运行时很难找到这类问题(假设编译器以某种方式设法将一种对象类型强制转换为另一种)。

于 2008-09-19T03:01:34.757 回答
5

是的,它会将当前在编译时发现的错误转移到在运行时发现的错误。虽然有些人认为这不是一个巨大的缺点,但这些人使用的是 Python、Ruby 或 Perl 而不是 Java ;-)。

于 2008-09-19T03:06:35.943 回答
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),则不会有任何严重的失败。要求显式转换的好处是它要求编码人员思考他在做什么,并意识到正在发生转换。

还有一些实例不能使用泛型,因为集合可以有不同的对象

您仍然可以使用通配符将不同的对象添加到通用集合中。

于 2008-09-19T03:13:25.740 回答
1

我会避免它,因为我有一种感觉,它稍后会回来咬你。在我看来,泛型是值得的,因为它们可以省去很多麻烦。此外,对包含不同对象类型的集合使用“容器”对象并不难。

于 2008-09-19T03:03:04.517 回答
1

在我看来,进行类型检查是一件好事。自动转换将消除潜在有用的编译时错误。

如果您担心击键次数,可以使用 Eclipse 之类的 IDE,如果可以通过双击插入类型转换。

于 2008-09-19T03:03:18.637 回答
0

正如其他人所说,自动类型转换将消除类型安全。仿制药有很多好处,而且真的不难申报。使用 Eclipse,您可以只声明泛型变量,然后在实例化上使用自动完成功能,它会自动填写您使用的类型。另外,您(或者更重要的是,其他人)有一个优势,即一眼就能知道列表或任何内容的确切内容。

于 2008-09-19T04:59:26.517 回答