通过java中的三元运算符传递方法参数

时间:2016-11-10 06:21:50

标签: java return-value ternary-operator ocpjp

代码:

public class Foo {

    static void test(String s){
        System.out.println("String called");
    }

    static void test(int s){
        System.out.println("int called");
    }

    public static void main(String[] args) throws Exception {

        test(5>8? 5:8);         // Line 1
        test(5>8? "he":"ha");   // Line 2

        test(5>8? 5:"ha");      // Line 3

        System.out.println(5<8? 5:"ha"); //Line 4
    }
}

当我执行此代码时,我在Line 3

处收到以下错误
Foo.java:24: error: no suitable method found for test(INT#1)
                test(5>8? 5:"ha");              // Line 3
                ^

在三元运算符中使用相似类型不会出错。但是使用不同的类型只会给方法调用test(5>8? 5:"ha");带来错误,但它适用于调用System.out.println(5<8? 5:"ha");

当我添加另一个重载方法static void test(Object s){}时,//Line 3会编译。

任何人都可以解释一下这种情况吗?

3 个答案:

答案 0 :(得分:4)

Java中的每个表达式都有一个类型。 Java语言规范中有一些复杂的规则,在the conditional operator部分告诉我们如何找到条件表达式的类型,例如5 > 8 ? 5 : "ha"。但简单来说,你总是得到第二个和第三个参数都是其成员的最具体的类型。

  • 对于5 > 8 ? 5 : 858都是int,因此整个表达式的类型为int
  • 对于5 > 8 ? "he" : "ha""he""ha"都是String,因此整个表达式的类型为String
  • 对于5 > 8 ? 5 : "ha",适合5"ha"的最具体类型是Object。因此整个表达式的类型为Object

现在,由于您的test版本接受int并接受String,因此表达式test ( 5 > 8 ? 5 : 8 )test ( 5 > 8 ? "he" : "ha" )都会编译。

但如果您没有接受test的{​​{1}}版本,则Object无法编译。

这是一种过度简化。规则比我描述的要复杂得多,但这主要是因为他们考虑了涉及test ( 5 > 8 ? 5 : "ha" )操作数,自动装箱和自动拆箱的各种情况。

答案 1 :(得分:0)

在评估表达式之前调用方法。由于该方法没有 test(Object o)的重载,因此它无法正常工作。

解析左侧表达式后调用该方法。

5>8?test(5):test("ha")

答案 2 :(得分:0)

当您调用该功能时

test(5>8? 5:8);
方法(在本例中)是为了发送参数,因此括号内的整个事物被认为是参数,并且没有适当的/合适的方法来处理这种类型的调用(其参数应该是Object),因为你是在其中一个语句中计算int和String。因此,无法在那里实施三元运算符。

因此你可以使用这样的代码

(5 > 8) ? test(param1): test(param2);


或创建另一个接受Object作为参数的测试方法,然后评估该测试方法中的内容。像这样

void test(Object o){
    //manipulate things here
}