1

Java中是否有任何“void”(带有小v,从方法返回)可以参与的语句?

例如,似乎甚至不可能在voidMe() instanceof Void哪里做:

void voidMe(){...}.

(出于好奇,这是一个理论问题。)

4

4 回答 4

3

是的 - 一个简单的方法调用:

voidMe();

那是一个声明。

如果你的意思是一个表达式,那么

voidMe()

仍然是一个表达式 - 只是一个结果什么都没有的表达式。从JLS 的第 15.1 节

当程序中的表达式被求值(执行)时,结果表示以下三种情况之一:

  • 变量(第 4.12 节)(在 C 中,这称为左值)

  • 一个值(§4.2,§4.3)

  • 什么都没有(据说表达式是无效的)

...

当且仅当表达式是调用不返回值的方法的方法调用(第 15.12 节),即声明为 void 的方法(第 8.4 节)时,表达式什么都不表示。这样的表达式只能用作表达式语句(第 14.8 节),因为表达式可以出现的所有其他上下文都需要表达式来表示某些东西。

突出显示的部分基本上说明了表达式的唯一用途,例如voidMe()方法调用。没有“更大”的表达可以voidMe()作为它的一部分。

于 2012-09-08T07:27:44.903 回答
1

在 Java 中,void不是类型或对象。因此,它不能成为“表达式”的一部分。

表达式中的任何运算符或函数都将使用其参数作为输入。但是,由于 void 不是有效类型,并且不存在 void 类型的对象,因此无法计算表达式。

因此,任何 void 函数本身都必须是一个语句。

您也不能创建 的实例Void,因为“Void 类是不可实例化的占位符类”。

于 2012-09-08T07:27:34.473 回答
1

Void 是不可实例化的,因此你不能在任何地方使用它的值。(说真的,你想什么都不做?你怎么可能有一个什么都没有的实例?)

但是,您可以将 Void 声明为类型参数。如果您想使用 java.concurrent 包中的某些类,这是必要的。例如,您需要声明 Future<Void> 以便将 void 方法提交到执行器服务。然后,您可以在一个地方询问结果,该结果将是 Void 类型。此结果始终为空。

于 2012-09-08T07:47:36.320 回答
1

我从Java 规范 §8.4.2复制

当且仅当以下条件成立时,具有返回类型 R 1的方法声明 d 1可以返回类型替换为具有返回类型 R 2的另一个方法 d 2 :

  • 如果R 1是,void那么R 2void

它可以被 Class literals Java Specification §15.8.2 使用

void.class( §8.4.5 )的类型是Class<Void>.
...
类文字评估为由当前实例的类的定义类加载器定义Class的命名类型(或 for )的对象。void

于 2012-09-08T07:36:35.630 回答