三元运算符可以用于调用方法吗?

2019-05-26 18:14:05 +08:00
 abigboy

今天突然想到这个问题,试了一下果然不行。 有大佬知道这是为什么吗?或者这是哪方面的知识啊?

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

5417 次点击
所在节点    编程
13 条回复
hcymk2
2019-05-26 18:43:31 +08:00
没有返回值啊。
tomoya92
2019-05-26 18:47:08 +08:00
静态方法应该用类名调用吧
geelaw
2019-05-26 18:48:52 +08:00
有些语言要求只有(属性 /事件 /索引器 /字段 /变量 /参数)(复合)赋值 /自增 /自减、方法调用、构造器调用、await、这些表达式才能成为语句,而其他表达式不能做语句(还有其他不是表达式语句的语句构造,略去)。

例如 new ClassName(); 是一个语句,但 (new ClassName()) 不是一个语句。

C/C++ 无此限制,C# 有此限制,看来 Java 也有。
sudri
2019-05-26 19:00:55 +08:00
需要有返回值才行
String result = t.isGoodlooking() ? kissMe() : fuckOff();
static String kissMe() {
System.out.println("Kiss me");
return "";
}
static String fuckOff() {
System.out.println("Fuck off");
return "";
}
geelaw
2019-05-26 19:09:23 +08:00
@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

这里明确表示只有赋值、自增自减、方法调用和对象创建表达式可以成为表达式语句,而 ?: 表达式不是上述类型,故增加一个分号后不能成为语句。
abigboy
2019-05-26 19:42:31 +08:00
@sudri 有返回值也是不行的
@geelaw 好的,谢谢你了🌹
MonoLogueChi
2019-05-26 21:44:16 +08:00
需要限定一下语言,C#是可以的

```cs
using System;

internal class Program
{
private static void Main(string[] args)
{
Program p = new Program();
int a = true ? p.A() : 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();` 不行,方法是不是静态的都可以。
KasuganoSoras
2019-05-26 22:33:02 +08:00
PHP 可以

<?php
function a() {
return true;
}
function b() {
echo "Is true";
}
function c() {
echo "Is false;";
}
a() ? b() : c();

Output: Is true
abigboy
2019-05-26 23:53:14 +08:00
@sudri 你说的是对的,但是问题是,后面那个三元运算符的式子要作为一个返回值赋给另一个变量,才能作为一条语句。单单一个三元运算符是不能作为一条语句的,如#5 楼大叔所说。谢谢你啦~~😎
mario85
2019-05-27 00:49:09 +08:00
@MonoLogueChi #7 C#还可以这样玩
(t.isGoodlooking()?(Action)kissMe:(Action)fuckOff)();
Java 不行,老实用 if 吧
geelaw
2019-05-27 04:15:07 +08:00
@abigboy #9 大叔?!
tomoya92
2019-05-27 08:19:33 +08:00
@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";
}

}
```
abigboy
2019-05-27 16:16:47 +08:00
@geelaw 好吧。。老哥😋
我错了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/567811

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX