Java中的运算符?(表达式1):(表达式2)中的表达式类型

时间:2018-01-12 10:53:22

标签: java operator-keyword

我遇到了一个问题,代码如下:

public class Test {

    public static void main(String[] args) {
        String str1 = "1";
        String str2 = "2";
        String str3 = "3";
        boolean flag = true;

        // way 1
        test(flag? str1, str2, str3: str1); 

        // way 2
        test(flag? (str1, str2, str3): str1);

        // way 3
        test(flag? new String[]{str1, str2, str3}: str1);

        // way 4
        test(flag? new String[]{str1, str2, str3}: new String[]{str1});

        // way 5
        test(flag? str1: str2);  
    }

    private static void test(String... args) {
        for(String arg: args) {
            System.out.println(arg);
        }
    }

}

我用五种方法调用方法test():

方式1称为失败。我以为我错过了括号。

方式2失败了。我认为这是(str1,str2,str3)的问题,Java编译器不理解它。

方式3失败了。 new String [] {}是一个String []对象,为什么Java编译器仍然不理解它?

方式4成功。冒号的左右参数是相同的类型。所以,我在方式5中打电话给它。

方式5成功调用。

我猜到了:

     ?(1):(2), the parameters in place 1 and 2 must be the same type?

任何对运营商有充分了解的人都可以:?解决我的困惑?谢谢。

4 个答案:

答案 0 :(得分:1)

String a = condition ? "pass" : "fail";

简写:

String a;
if ( condition ) {
  a = "pass";
} else {
  a = "fail";
}

答案 1 :(得分:0)

它被称为"三元运算符"。更多信息: https://en.wikipedia.org/wiki/%3F

通常,java中的三元运算符可以根据条件返回不同类型的值。这是java中的有效表达式:

int anInteger = 1;
String aString = "a";

System.out.println(true ? anInteger : aString);
System.out.println(false ? anInteger : aString);

输出:

1
a

另一方面,在您的代码段中,返回的值作为参数传递给test方法,该方法将String ...作为参数。因此返回的值应该与该类型匹配。

答案 2 :(得分:0)

我不能说我有深刻的理解。但无论如何我会试着解释一下。

?: operator基本上用于简化if else表达式

if (a > b) {
  c = a;
}
else {
  c = b;
}

这可以写成c = (a > b) ? a : b;

现在,方式1

test(flag? str1, str2, str3: str1); 

编译器失败,因为它期望a:而不是str1之后的,这就是它失败的原因。

现在正在进行中2

test(flag? (str1, str2, str3): str1);

(str1,str2,str3)不是有效对象。您必须创建一个数组来存储一组字符串。简单地将它们捆绑在()中就不会起作用。

方式3

test(flag? new String[]{str1, str2, str3}: str1);

现在我认为这种失败的原因是因为test需要字符串数组输出,但str1只是一个字符串。

方式4

test(flag? new String[]{str1, str2, str3}: new String[]{str1});

这成功执行但只是像这样切换会导致输出失败。

test(flag? new String[]{str1}: new String[]{str1, str2, str3});

因为test需要一个字符串数组作为输出。 但编译是成功的,因为它们都是字符串数组。

方式5

test(flag? str1: str2); 

这是我之前的测试期望String []失败的原因。 但即使编译成功,你也不会得到输出,因为测试仍然期望输出数组。

答案 3 :(得分:0)

看起来人们真的不明白你的问题,你可能想要编辑它。

无论如何,这是我的答案:

方法1&方法2:语法没有意义,你要求编译器做一些它不能做的事情。三元表达必须如下:

value = condition ? expression : expression

逗号不是java中的运算符,编译器只需要运算符。

方法3:失败,因为三元表达式的两个可能结果必须具有相同的类型。这就是方法4工作正常的原因。

方法5:编译很好,但是不起作用,因为你的构造函数仍然需要一个数组。

编辑:我还应该提一下,如果你的条件验证为false,方法4也会因ArrayIndexOutOfBoundsException而失败,但这对你的问题来说是微不足道的。