黑马程序员技术交流社区

标题: 必备知识---三元表达式(?:) [打印本页]

作者: itheima_llt    时间: 2015-3-20 09:23
标题: 必备知识---三元表达式(?:)
  1. char x = 'X'; int i = 0;
  2. System.out.println(true ? x : 0);// X
复制代码
条件表达式结果类型的规则:
(1) 如果第二个和第三个操作数具有相同的类型,那么它就是条件表达式的类型。
(2) 如果一个操作的类型是T,T表示byte、short或char,而另一个操作数是一个int类型的“字面常量”,并且它的值可以用类型T表示,那条件表达式的类型就是T。
(3) 否则,将对操作数类型进行提升,而条件表达式的类型就是第二个和第三个操作被提升之后的类型。  
现来使用以上规则解上面的迷题,第一个表达式符合第二条规则:一个操作数的类型是char,另一个的类型是字面常量为0的int型,但0可以表示成char,所以最终返回类型以char类型为准;第二个表达式符合第三条规则:因为i为int型变量,而x又为char型变量,所以会先将x提升至int型,所以最后的结果类型为int型,但如果将i定义成final时,则返回结果类型为char,则此时符合第二条规则,因为final类型的变量在编译时就使用“字面常量0”来替换三元表达式了:
  1. final int i = 0;
  2. System.out.println(false ? i : x);// X
复制代码

在JDK1.4版本或之前,条件操作符 ?: 中,当第二个和延续三个操作数是引用类型时,条件操作符要求它们其中一个必须是另一个的子类型,那怕它们有同一个父类也不行:
  1. public class T {  public static void main(String[] args) {   System.out.println(f());  }
  2. public static T f() {   // !!1.4不能编译,但1.5可以   // !!return true?new T1():new T2();


  3. return true ? (T) new T1() : new T2();// T1
  4. } }  
  5. class T1 extends T {  public String toString() {   return "T1";
  6. }
  7. }  
  8. class T2 extends T {  public String toString() {









  9.   return "T2";
  10. } }
复制代码
在5.0或以上版本中,条件操作符在延续二个和第三个操作数是引用类型时总是合法的。其结果类型是这两种类型的最小公共超类。公共超类总是存在的,因为Object是每一个对象类型的超类型,上面的最小公共超类是T,所以能编译。
                                                                                                                                                                          ------参考java解惑








欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2