【发布时间】:2019-04-26 06:31:56
【问题描述】:
我已对此进行了搜索,并且有一些关于同一问题的问题,但这些问题的答案似乎都无法解决我的问题。
我查阅了规范并设法找到以下几点:
第一个三元表达式必须是布尔类型
第二个和第三个表达式不能调用 void 方法。
如果我编写以下代码,则给出上述信息
String res;
System.out.println(res="walter");
它将 walter 打印到控制台,这意味着表达式返回了一些东西,因此它不是无效的。但是现在如果尝试写这个
String stuff = "TV";
String res=null;
stuff.equals ("TV") ? res= "Walter" : res = "White" ;
此代码无法编译 赋值的左边必须是变量
即使满足上述两个条件(据我所知)。为什么代码无法编译以及为什么它需要左侧的变量?
如果我这样做
res = stuff.equals("TV")?res="WALTER":res="WHITE";
代码编译失败
对于参数类型 java.lang.String,java.lang.String,运算符
但以下编译正常
res = stuff.equals("TV")?res="WALTER":"WHITE";
PS
- 为什么三元运算符左边一定要有变量,方法返回值可以丢弃,为什么在三元的情况下不能这样做。
- 为什么 Java 不允许它,如果允许它会导致什么问题或不一致
【问题讨论】:
-
因为它是一个表达式,而不是一个 StatementExpression。
-
不知道你为什么要这样完成作业,你应该可以这样做:
res = stuff.equals("TV") ? "Walter" : "White" ;这有点干净,让你不必把res =多次 -
部分答案:第一个语法错误是由于运算符优先规则造成的。
stuff.equals ("TV") ? res= "Walter" : res = "White"被解析为(stuff.equals ("TV") ? res= "Walter" : res) = "White"。尝试改用stuff.equals ("TV") ? res= "Walter" : (res = "White"),但即便如此,由于安迪给出的原因,它也无法编译。
标签: java ternary-operator