Java中是否有任何“无效”参与的声明?

时间:2012-09-08 07:23:07

标签: java jvm

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

例如,似乎甚至无法在voidMe() instanceof Void处执行:

void voidMe(){...}

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

4 个答案:

答案 0 :(得分:3)

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

voidMe();

这是一个声明。

如果您的意思是表达式,那么

voidMe()

仍然是一个表达式 - 只是结果无效的表达式。来自section 15.1 of the JLS

  

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

     
      
  • 变量(§4.12)(在C中,这将被称为左值)

  •   
  • 值(§4.2,§4.3)

  •   
  • 没什么(表达是无效的)

  •   
     

...

     

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

突出显示的部分基本上表明voidMe()等表达式的使用是方法调用。没有“更大”的表达可以将voidMe()作为其中的一部分。

答案 1 :(得分:1)

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

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

因此,任何void函数都必须是一个声明。

您也无法创建Void的实例,因为“Void类是一个不可安装的占位符类”。

答案 2 :(得分:1)

我是从Java Specification §8.4.2

复制的
  

返回类型为R 1 的方法声明d 1 return-type-substitutable ,用于另一种方法d 2 返回类型R 2 ,当且仅当满足以下条件时:

     
      
  • 如果R 1 void,则R 2 void
  •   

它可以由类文字Java Specification §15.8.2

使用
  

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

答案 3 :(得分:1)

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

但是,您可以将Void声明为类型参数。如果要使用java.concurrent包中的某些类,这是必需的。例如,您需要声明一个Future&lt; Void&gt;为了向执行程序服务提交void方法。在一个地方,你可以询问结果,这将是Void类型。此结果始终为null。