我遇到了一个问题,代码如下:
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?
任何对运营商有充分了解的人都可以:?解决我的困惑?谢谢。
答案 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而失败,但这对你的问题来说是微不足道的。