`

Expressive Puzzlers (2)

J# 
阅读更多
Puzzle 8:
DosEquiz.java
<!---->public class DosEquis
{
    
public static void main(String[] args)
    {
        
char x = 'X';
        
int i = 89;
        
final int j = 89;
        
final int k = 6666666;
        System.out.println(
true ? x : 88);  // X
        System.out.println(false ? i : x); // 88
        
        System.out.println(
true ? j : x); // Y
        System.out.println(false ? j : x); // X
        System.out.println(true ? k : x);  // 6666666
        System.out.println(false ? k : x);  // 88
        
        
        
//System.out.println((true ? true : new Boolean(true)).booleanValue()); \\ a compile-time error 
        
//System.out.println((true ? false : new Boolean(true)).booleanValue()); \\ a compile-time error 
        System.out.println(new Boolean((true ? true : new Boolean(true))).booleanValue()); //ok
        
        
//Double aInt = true ? new Integer(1) : null; -- a compile-time error 
        
//Double aInt = false ? new Integer(1) : null; -- a compile-time error 
        
        
    }
}

这个谜题是关于 Conditional Operator ? :[JLS 15.25]。
1、Conditional Operator 有三个运算符表达式,第一个必须是 boolean或 Boolean型的,否则引发一个compile-time error 。
2、一个 Conditional Expression的类型T是由第二个表达式 T2和第三个表达式T3的类型来决定的。具体规则如下:
  • rule 1:  如果T2 == T3(包括T2 == T3 == null的情况),那么 T = T2(T3)。
  • rule 2:  如果 T2与T3这两个之中有一个是boolean型,另外一个是Boolean型,那么 T = boolean。
  • rule 3:  如果T2与T3之中有一个是null类型,而另外一个是一个引用类型(reference type) RT,那么T = RT
  • 如果T2与T3是可以转化成数值类型的,那么结果有以下几种情况:
    1. rule 4:  如果T2与T3有一个是byte或者Byte,另一个是short或者Short,那么T = short
    2. rule 5:  如果T2与T3中有一个是 GT 型,这里 GT 泛指byte, short, char中的任何一个, 而且另一个是一个int型的常量表达式(注意,必须是一个 int型的constant expression),而且 该常量表达式可以用GT表示(即不会产生精度损失的情况,个人的理解^_^),则T=GT。
    3. rule 6: 如果T2和T3有一个是Byte型,另一个是可以用byte型表示的int型常量表达式,那么T=byte
    4. rule 7: 如果T2和T3有一个是Short型,另一个是可以用byte型表示的int型常量表达式,那么T=short
    5. rule 8: 如果T2和T3有一个是Character型,另一个是可以用char型表示的int型常量表达式,那么T=char
    6. rule 9:  Otherwise, binary numeric promotion (JLS 5.6.2) is applied to the operand types, and the type of the conditional expression is the promoted type of the second and third operands. Note that binary numeric promotion performs unboxing conversion (JLS 5.1.8) and value set conversion (JLS 5.1.13).(这个很多词语都不知该怎么翻译,就直接copy过了。。。)
  • rule 10:  Otherwise, the second and third operands are of types S1 and S2 respectively. Let T1 be the type that results from applying boxing conversion to S1, and let T2 be the type that results from applying boxing conversion to S2. The type of the conditional expression is the result of applying capture conversion (JLS 5.1.10) to lub(T1, T2) (JLS 15.12.2.7).


Puzzle 9:
Tweedledum.java
<!---->public class Tweedledum
{
    
public static void main(String [] args)
    {
        
long i = 1;
        
int x = 0;
        x 
+= i;   //It is ok because it contains a hidden cast
        x = x + i; // a compile-error
    }
}
关于Compound Assignment Operators,参见JLS 15.26.2.
Puzzle 10:
Tweedledee.java
<!---->public class Tweedledee
{
    
public static void main(String[] args)
    {
        
// Put your declarations for x and i here

        Object x 
= "Buy ";
        String i 
= "Effective Java!";
        x 
= x + i;
        
// Must be LEGAL
        x += i;
        
// Must be ILLEGAL

    }
}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics