Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 内部语句:表达式_Java_Scala - Fatal编程技术网

Java 内部语句:表达式

Java 内部语句:表达式,java,scala,Java,Scala,我正在学习scala并试图理解以下句子: 在Java中,不能将语句放入?:表达式中 有人能给我解释一下吗?也许是举个例子,也许是在Scala的上下文中?你放在?:表达式中的东西是其他表达式。第一个必须计算为布尔值,第二个和第三个必须计算为相同的类型(int、String等)。语句是执行的东西,表达式是产生值的东西。这会让人困惑,因为你可以把可执行的东西放在一个表达式中。Java有一个从C继承的三元条件运算符,它看起来像这样: int x = some_condition ? 1 : 2; 如果

我正在学习scala并试图理解以下句子:

在Java中,不能将语句放入?:表达式中


有人能给我解释一下吗?也许是举个例子,也许是在Scala的上下文中?

你放在?:表达式中的东西是其他表达式。第一个必须计算为布尔值,第二个和第三个必须计算为相同的类型(int、String等)。语句是执行的东西,表达式是产生值的东西。这会让人困惑,因为你可以把可执行的东西放在一个表达式中。

Java有一个从C继承的三元条件运算符,它看起来像这样:

int x = some_condition ? 1 : 2;
如果某个条件为真,
x
将等于
1
,否则等于
2
。Java要求这个操作符的参数是表达式,即产生具体值的东西。例如,方法调用或常量文字是表达式,但循环、条件语句或变量定义不是表达式,因为它们没有有意义的值。这意味着您不能从函数返回变量定义,但可以返回方法调用的结果

Scala没有三元运算符。但它不需要,因为在Scala中,一切都是表达式。偶数循环-它们产生一个特殊的
Unit
type值。条件也是表达式,它们返回所有分支的公共超类型值。因此,您可以使用普通条件“语句”而不是三元运算符。此Scala代码段相当于上面的Java代码段:

val x=if(某些条件)1其他2
此外,在Scala中,每个块也是一个表达式(其值是块中最后一行的值),因此可以在“三元运算符”中包含语句,例如赋值:

val x=if(某些条件){
val y=某些_计算()
y*2
}否则{
val z=另一个_计算()
z+3
}

更一般地说,不能在任何表达式中放入任意语句,而不仅仅是在条件表达式中

方法的块是语句列表。语句由其他语句和/或表达式组成。但是表达式作为语句的组成部分,通常不包含语句

有一个例外:表单的类创建表达式

new C(argument list) { class definition }
这将在编译时创建一个新类,该类是
C
的子类,并在运行时创建该类的实例。因此,可以编写如下内容:

cond ? (new Object() { 
         public int get() { System.out.println("Hi"); return 42; }
       }).get() 
     : 0

将语句偷偷带到表达式中。

是否编译?因为
newobject().get()
应该告诉您没有这样的方法(即使您在匿名子类中定义了一个)。@zapl-Nope,只要您不将引用分配给Object类型的变量,就可以了。哦,您是对的,我的印象是,这种构造的编译时类型仍然是
Object
,不允许调用
get
。非常聪明!如果有可能用Java8Lamdas使它更干净,那就很有趣了……好吧,Scala没有这样的构造
boolexpr?expr1:expr2
。但是,您可以使用if-else表达式来实现相同的效果,因为if-else具有返回值。