void run() {
...
if (done) return cancel();
...
}
其中cancel()
返回void
。这不会编译...,我可以[[几乎理解原因。但是,如果我想从一个空白中返回一个空白,为什么不呢?相反,我最终写了这样的东西:
if (done) {
cancel();
return;
}
我不是在寻找代码样式建议,我想知道为什么Java明确禁止这种类型的void返回。任何信息表示赞赏,谢谢。
cancel()
的类型是一个无效表达式-它不是have值。
逻辑上,您想执行cancel()
,然后返回-这就是您要说的。这两个动作(分别调用cancel()
和返回)在逻辑上是不同的。现在Java
可以
具有某种"unit" type而不是void
-但这不仅会影响返回值,而且会影响更多。some expression
不是类型。方法定义中的run()
只是一个占位符,不返回任何内容。return x
组成。 void方法是not
void
实际上并不关心方法调用的类型,所以这不是问题。在类型检查系统中,它必须位于链的下游。我认为最重要的是,在return关键字之后包含if
void
是返回类型),因此您的第一条语句似乎很有意义。我只会将此视为惯例。由于void
是占位符而不是对象,因此可能出于语言一致性或简化编译器的目的而决定将其省略。 来自JLS
不带表达式的return语句必须包含在使用关键字void声明的方法的主体中,不返回任何值(第8.4节),或构造函数的主体(第8.8节)。
进一步
确切地说,没有表达式的return语句总是突然完成,原因是没有值的return
void v = (void) 1;
return (v);
所以,我认为Java中的void
不是type
。在C ++中,return cancel();
是合法的。作为熟悉Java的C ++程序员,答案是:Java语法不支持许多功能。也许是出于简单性或可读性。注:
void f()
声明类似于pascal中的procedure f()
声明,并且过程无法返回任何值(例如函数),因此我们必须在单独的语句中调用它们。
返回 return null
。 void
不是值,因此无法返回。
void
语句必须返回有效值,但是方法声明return cancel()
声明void run()
不返回值;因此,run()
中的return cancel()
是错误。 run()
语句(不带表达式)尝试将控制权转移给调用方,并在方法返回类型为return
时使用;因此,不是错误。详细回答
void
JLS状态:不带表达式的return语句尝试将控制权转移给包含它的方法或构造函数的调用者。 [...]带有表达式的return语句必须包含在声明为返回值(第8.4节)的方法声明中,否则会发生编译时错误。表达式必须表示某个类型T的变量或值,否则会发生编译时错误。类型T必须可分配给方法的声明结果类型(第5.2节),否则会发生编译时错误。
JLS The *return* Statement
section状态:
方法的返回类型声明了方法返回的值的类型(如果它返回一个值),或者声明该方法无效。具有且仅当以下条件成立时,具有返回类型R1的方法声明d1可替换具有返回类型R2的另一方法d2:[...] *如果R1为空,则R2为空。][JLS
The *return* Statement
,第一段指出:
Java编程语言是一种强类型语言,这意味着每个变量和每个表达式都具有在编译时已知的类型。类型限制变量(第4.12节)可以持有或表达式可以产生的值,限制对这些值支持的操作,并确定操作的含义。JLS
Method Return Type
section状态:
Java编程语言中有两种类型:基本类型(第4.2节)和引用类型(第4.3节)。相应地,可以将两种数据值存储在变量中,作为参数传递,由方法返回并对其进行操作:原始值(第4.2节)和引用值(第4.3节)。现在只需再引用几句话。 JLS
Method Return Type
状态:
与C和C ++不同,Java编程语言仅允许将某些形式的表达式用作表达式语句。请注意,Java编程语言不允许“强制转换为无效” -void不是类型
如果方法被声明为空,则其主体不得包含任何具有表达式的返回语句(第14.17节)。最后,JLS
Types, Values, and Variables
声明:
方法声明要么指定该方法返回的值的类型,要么使用关键字void指示该方法不返回值。现在,当我们将它们拼凑在一起时,我们可以推断出以下内容:
The Kinds of Types and Values
section语句包含表达式,则该表达式必须计算为有效值。The Kinds of Types and Values
表达式值必须是原始类型或引用类型。Expression Statements
section不是有效的值类型。Expression Statements
返回类型声明的方法,不返回值。Method Body
section不返回值。Method Body
中,Method Declarations
section,不带表达式,将愉快地将控制权转移给调用者。Method Declarations
中,return
是错误,因为return
必须是有效值,并且void
不返回值。void
明确表示“返回值x”,无论该类型是什么(当然,该类型仍必须与放置该语句的任何函数的返回类型相匹配)。]这是即使方法return
为run()
,编译器也不允许您编写return some expression
的原因。