无赋值的Java三元

无赋值的Java三元,java,ternary-operator,ternary,Java,Ternary Operator,Ternary,有没有一种方法可以在不做赋值的情况下执行java三元操作,或者有没有一种方法可以伪造赋值 我喜欢三元代码在执行一系列if/then/else时的简洁外观 我希望能够基于布尔代数语句调用两个空函数中的一个 比如: (bool1&bool2)?voidFunc1():voidFunc2() 我的函数是返回类型void,因此如果有一种方法可以在赋值中伪造它以使其工作,那么我可以接受……我想看看如何执行:)不,你不能这样做 如果你不喜欢这种风格,你可以选择这种风格 if(bool1 &&

有没有一种方法可以在不做赋值的情况下执行java三元操作,或者有没有一种方法可以伪造赋值

我喜欢三元代码在执行一系列if/then/else时的简洁外观

我希望能够基于布尔代数语句调用两个空函数中的一个

比如:

(bool1&bool2)?voidFunc1():voidFunc2()


我的函数是返回类型
void
,因此如果有一种方法可以在赋值中伪造它以使其工作,那么我可以接受……我想看看如何执行:)

不,你不能这样做

如果你不喜欢这种风格,你可以选择这种风格

if(bool1 && bool2) voidFunc1(); else voidFunc2();

在三值运算符中,操作数必须是非空表达式;也就是说,它们必须产生一些实际值。

不,您不能这样做

条件运算符有三个操作数表达式。?出现 在第一个表达式和第二个表达式之间,和:出现在 第二和第三个表达式

第一个表达式的类型必须为boolean或boolean,或 发生编译时错误

这是第二个或第三个操作数的编译时错误 表达式是对void方法的调用

[编辑]

既然你问了关于反思的问题,这里有一个解决方案。我不推荐这个。我之所以发布它,只是因为你问了

public class MyCall
{

    public void a(){System.out.println("a");}
    public void b(){System.out.println("b");}

    public static void main(String... args)
    {
        new MyCall().go();
    }

    public void go()
    {
        Class<? extends MyCall> class1 = this.getClass();
        Method aMethod = class1.getMethod("b", null);
        Method bMethod = class1.getMethod("a", null);
        Object fake = false ? aMethod.invoke(this, null) : bMethod.invoke(this, null);
        Object fake2 = true ? aMethod.invoke(this, null) : bMethod.invoke(this, null);
    }
}

实际上,我支持,即使循环只包含一行,也要使用大括号,但是因为您要的是清晰的代码,上面的代码段应该可以。

如果您真的想使用任何操作,那么有一个技巧。 但这是非常糟糕的代码,仅用于显示语言能力。 我决不建议将此代码投入生产,甚至向您的朋友展示

int dummy = (bool1 && bool2) ? new Object(){
        public int hashCode() {
            yourFunction1();
            // ...
            yourFunctionN();
            return 0;
        };
    }.hashCode() : new Object(){
        public int hashCode() {
            yourAnotherFunction1();
            // ...
            yourAnotherFunctionN();
            return 0;
        };
    }.hashCode();
有没有一种方法可以在不执行赋值的情况下执行java三元操作,或者有没有一种方法可以伪造赋值

好的,那么当你写这样的语句时:

    (bool1 && bool2) ? voidFunc1() : voidFunc2();
    SomeType dummy = (bool1 && bool2) ? voidFunc1() : voidFunc2();
代码有两个明显的问题:

  • 条件表达式1的第2个和第3个操作数不能调用void方法。引用:

  • 表达式不是语句,除非它是and赋值表达式、方法调用或对象创建。引用:

  • 事实上,第二个问题是语法错误,我希望任何主流Java编译器都会报告它,而不是第一个问题

        (bool1 && bool2) ? voidFunc1() : voidFunc2();
    
        SomeType dummy = (bool1 && bool2) ? voidFunc1() : voidFunc2();
    

    其中,
    gobble
    是一个除了“使用”其参数值之外什么都不做的方法

    好吧,没有任何上下文可以接受原始表达式

    但是,有一些方法可以包装
    void
    函数,以便在条件表达式中调用它们。下面是一种方法:

     int dummy = (bool1 && bool2) ? 
         () -> {voidFunc1(); return 0;} : 
         () -> {voidFunc2(); return 0;};
    


    1-“条件表达式”是Java语言规范中用于此构造的主要术语。它被称为“三元条件运算符”“在Oracle Java教程中。

    对中的反射注释有何想法:是否有方法将空反射为空,然后将空分配给对象?使用反射解决方案编辑了我的答案。当然,出于学术目的:)回答了我提出的问题,所以我接受答案。。。我的实际代码将更像TGMCians显示的内联if/then/else代码。:)这个问题早就得到了回答,但我有一个想法。(注:我不是职业选手)。如果他让那些空函数返回一个整数呢。说-1。然后他运行
    int fake=bool?方法1:方法2
    它们都返回-1,但所需的代码仍在运行。我使用这个,还没有遇到任何问题。我喜欢这个演示。。。如果没有人能给我一个方法,我会接受这个答案。例如,通过从空到空的反射。。。等等。您可以更改函数以始终返回常量值,并将此返回值指定给伪变量。但这不值得这么麻烦——恐怕代码看起来很愚蠢。最好像你已经知道的那样去做。