考试网 >> IT认证 >> JAVA >> JAVA指导 >> JAVA更多的类谜题75:头还是尾

JAVA更多的类谜题75:头还是尾

发布时间:2006-06-28 10:21     点击:
分页:[1] 2 3  下一页

这个程序的行为在1.4版和5.0版的Java平台上会有些变化。这个程序在这些版本上会分别做些什么呢?(如果你只能访问5.0版本的平台,那么你可以在编译的时候使用-source 1.4标记,以此来模拟1.4版的行为。)

import java.util.Random;
public class CoinSide {
private static Random rnd = new Random();public static CoinSide flip() {return rnd.nextBoolean() ? Heads.INSTANCE : Tails.INSTANCE;}public static void main(String[ ] args) {System.out.println(flip());}
}class Heads extends CoinSide {private Heads() { }public static final Heads INSTANCE = new Heads();public String toString() {return "heads";}
}class Tails extends CoinSide {private Tails() { }public static final Tails INSTANCE = new Tails();public String toString() {return "tails";}
}
该程序看起来根本没有使用5.0版的任何新特性,因此很难看出来为什么它们在行为上应该有差异。事实上,该程序在1.4或更早版本的平台上是不能编译的:

CoinSide.java:7: 
incompatible types for ?: neither is a subtype of the other
second operand: Heads
third operand : Tailsreturn rnd.nextBoolean() ?^
条件操作符(?:)的行为在5.0版本之前是非常受限的[JLS2 15.25]。当第二个和第三个操作数是引用类型时,条件操作符要求它们其中的一个必须是另一个的子类型。Heads和Tails彼此都不是对方的子类型,所以这里就产生了一个错误。为了让这段代码能够编译,你可以将其中一个操作数转型为二者的公共超类:

return rnd.nextBooleam() ?
(CoinSide)Heads.INSTANCE : Tails.INSTANCE;
在5.0或更新的版本中,Java语言显得更加宽大了,条件操作符在第二个和第三个操作数是引用类型时总是合法的。其结果类型是这两种类型的最小公共超类。公共超类总是存在的,因为Object是每一个对象类型的超类型。在实际使用中,这种变化的主要结果就是条件操作符做正确的事情的情况更多了,而给出编译期错误的情况更少了。对于我们当中的语言菜鸟来说,作用于引用类型的条件操作符的结果所具备的编译期类型与在第二个和第三个操作数上调用下面的方法的结果相同:
分页:[1] 2 3  下一页
版权申明:未经书面授权请勿转载本站信息!!作品版权归所属媒体与作者所有!!
发表评论: 匿名发表 用户名: 查看评论
您将承担一切因您的行为、言论而直接或间接导致的民事或刑事法律责任
留言板管理人员有权保留或删除其管辖留言中的任意内容
本站提醒:不要进行人身攻击。谢谢配合。
在本站搜索相关信息
2003-2005 Ksw123.com All Rights Reserved. - TOP
Copyright © 2006 Ksw123.com. All rights reserved.中国考题网 版权所有