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是每一个对象类型的超类型。在实际使用中,这种变化的主要结果就是条件操作符做正确的事情的情况更多了,而给出编译期错误的情况更少了。对于我们当中的语言菜鸟来说,作用于引用类型的条件操作符的结果所具备的编译期类型与在第二个和第三个操作数上调用下面的方法的结果相同:
|
您将承担一切因您的行为、言论而直接或间接导致的民事或刑事法律责任
留言板管理人员有权保留或删除其管辖留言中的任意内容 本站提醒:不要进行人身攻击。谢谢配合。 |