译者:

易晓斓的其他译作

原文:

Java Puzzlers

- Java谜题选 - I 之答案

原作者 Josh Bloch 的其他文章:

本周热评

其它收藏服务:

金牌译作 Java谜题选 - I 之答案

1712个读者 易晓斓 @ yeeyan.com 2007年08月19日 双语对照  原文 字体大小

谜题一之答案,分析过程,以及经验教训


 答案

(b)100

分析过程

1 在Set中加入的是一个Short值,但是删除的却是Integer的值。(译者:从留言中,很高兴看到有些朋友看到了这一点)
2 此行程序,s.remove(i-1),中的i-1是一个返回值为int的指示。如果i是short或byte类型,当它与int或long做算术运算时,返回的一定是int或long类型的值。
3 在执行s.remove方法时,上面的int值将被autobox成一个Integer对象。
4 注意,包含值1的Short对象和包含值1的Integer对象在比较中不被认为是对等的。
5 在Set中加入Short对象后,再删除Integer对象,后者的命令是不会被运行的(no-op)。编译器也不会报错。

经验教训

1 在Java1.5中,Set的接口是这样定义的:

    public interface Set<E>extends Collection<E> {
       public abstract boolean add(E e);
       public abstract boolean remove(Object o);
       ...
    }

根据上面的定义,add方法中传过去的参数类型一定要与Set中定义的类型一致,否则编译器会报错。但是,remove方法却无此限制,它接受的类型是Object,所以你可以remove任何类型,这就是所谓的type safe。这是在1.5中对Collection的generifying过程中,为了保留对以前版本中方法的支持而造成的。

2 对程序做如下改动就可以解决问题: (short)(i-1); 即把(i-1)的int再cast成short,然后它会被autobox成Short对象,这样前面指示行里在Set中加的Short就会被删除,最后的答案也就变成(a)了。所以,任何牵扯到不同数值类型之间的运算(byte, short, char和int,long),返回的值一定是int或long。 一定要小心,尽量不要混合使用。尽量使用int或long。



本文版权所有,未经许可,请勿转载
内容合作请 联系我们

译作评分
8.0
请给出您的评分  提交

更多关于 Java Puzzlers 基本编程 的翻译文章

1条评论

添加评论

阅读
发现
翻译
合作媒体

Copyright © 2009 yeeyan.com All rights reserved. 京ICP证080457号