
今天突然想到这个问题,试了一下果然不行。 有大佬知道这是为什么吗?或者这是哪方面的知识啊?
public class Test { public static void main(String[] args){ Test t=new Test(); t.isGoodlooking()?kissMe():fuckOff(); } boolean isGoodlooking(){ return true; } static void kissMe(){ System.out.println("Kiss me"); } static void fuckOff(){ System.out.println("Fuck off"); } } 第五行报错 not a statement
1 hcymk2 2019 年 5 月 26 日 via Android 没有返回值啊。 |
2 zael 2019 年 5 月 26 日 via iPhone 静态方法应该用类名调用吧 |
3 geelaw 2019 年 5 月 26 日 via iPhone 有些语言要求只有(属性 /事件 /索引器 /字段 /变量 /参数)(复合)赋值 /自增 /自减、方法调用、构造器调用、await、这些表达式才能成为语句,而其他表达式不能做语句(还有其他不是表达式语句的语句构造,略去)。 例如 new ClassName(); 是一个语句,但 (new ClassName()) 不是一个语句。 C/C++ 无此限制,C# 有此限制,看来 Java 也有。 |
4 handbrake 2019 年 5 月 26 日 需要有返回值才行 String result = t.isGoodlooking() ? kissMe() : fuckOff(); static String kissMe() { System.out.println("Kiss me"); return ""; } static String fuckOff() { System.out.println("Fuck off"); return ""; } |
5 geelaw 2019 年 5 月 26 日 via iPhone @hcymk2 #1 @sudri #4 并不是那个原因(或者应该说这不是第一个原因),这里出现的是一个句法错误而不是一个语义错误,当然返回 void 的方法调用表达式不能作为另一个表达式的一部分,这会造成语义错误。 #4 的代码能编译是要谢谢那里结果作为另一个变量的初始化表达式,如果你删除 String result =,依然不能编译成功。 @tomoya92 #2 并不是那个原因。 https://docs.oracle.com/javase/specs/jls/se12/html/jls-14.html#jls-14.8 这里明确表示只有赋值、自增自减、方法调用和对象创建表达式可以成为表达式语句,而 ?: 表达式不是上述类型,故增加一个分号后不能成为语句。 |
7 MonoLogueChi 2019 年 5 月 26 日 需要限定一下语言,C#是可以的 ```cs using System; internal class Program { private static void Main(string[] args) { Program p = new Program(); int a = true ? p.() : p.B(); Console.ReadKey(); } private int A() { Console.WriteLine("A"); return 0; } private int B() { Console.WriteLine("B"); return 0; } } ``` 输出是 ``` A ``` 做了一下测试,函数返回 void 类型不行,必须有赋值给其他变量,比如直接写 `true ? p.A() : p.B();` 不行,方法是不是静态的都可以。 |
8 KasuganoSoras 2019 年 5 月 26 日 PHP 可以 <?php function a() { return true; } function b() { echo "Is true"; } function c() { echo "Is false;"; } a() ? b() : c(); Output: Is true |
9 abigboy OP @sudri 你说的是对的,但是问题是,后面那个三元运算符的式子要作为一个返回值赋给另一个变量,才能作为一条语句。单单一个三元运算符是不能作为一条语句的,如#5 楼大叔所说。谢谢你啦~~ |
10 mario85 2019 年 5 月 27 日 via iPhone |
12 zael 2019 年 5 月 27 日 @hcymk2 @abigboy 确实加个返回值就可以了 ```java public class Test { public static void main(String[] args) { Test t = new Test(); System.out.println(t.isGoodlooking() ? kissMe() : fuckOff()); } boolean isGoodlooking() { return true; } static String kissMe() { return "Kiss me"; } static String fuckOff() { return "Fuck off"; } } ``` |