Void与无参数之间有什么区别?

Ada*_*Lee 59 java void

我有一个类定义了两个重载方法

public void handle(Void e) 

protected void handle() 
Run Code Online (Sandbox Code Playgroud)

显然他们是不同的,尤其handle(Void e)public.


这两者有什么区别?

如何调用第一种方法?我正在使用handle(null)- 这是正确的吗?

Boh*_*ian 66

Void是一个通常仅用于反射的特殊类 - 它的主要用途是表示void方法的返回类型.从javadocVoid:

Void类是一个不可实例化的占位符类,用于保存对表示Java关键字void的Class对象的引用.

因为Void无法实例化类,所以可以传递给具有Void类型参数的方法的唯一值,例如handle(Void e),null.


这是事件的正式版本,但对于那些感兴趣的人,尽管在javadoc中声称相反Void,你实际上可以实例化一个实例Void:

Constructor<Void> c = Void.class.getDeclaredConstructor();
c.setAccessible(true);
Void v = c.newInstance(); // Hello sailor!
Run Code Online (Sandbox Code Playgroud)


也就是说,Void当你想表明该类型被"忽略"时,我已经看到"有用"用作通用参数类型,例如:

Callable<Void> ignoreResult = new Callable<Void> () {
    public Void call() throws Exception {
        // do something
        return null; // only possible value for a Void type
    }
}
Run Code Online (Sandbox Code Playgroud)

Callable通用参数是返回类型,因此当Void像这样使用时,即使Callable需要使用接口,例如使用Executor框架,对于代码的读者来说,返回值并不重要,这是一个明确的信号.

  • 它并不意味着"不关心类型"这意味着"我想返回什么,但是泛型不支持`void",因为它不是类,所以我使用`Void`代替". (8认同)
  • @Adam这可能听起来像一个奇怪的请求,但你明明会接受另一个答案吗?原因是如果我的一个答案超过了被接受的答案,我会得到一个特殊的"帽子".这将是一个很好的圣诞礼物:) - 谢谢 (2认同)

Con*_*ion 42

第一个函数是单个参数的函数,必须提供该函数并且只能有效地获取该值null.除null之外的任何值都不会编译.第二个函数不带任何参数,传递null给它就不会编译.

  • 使用Void作为参数的任何目的? (8认同)
  • 不,波希米亚人说它存在能够代表虚方法的返回值以达到反思的目的. (4认同)

Raf*_*ele 15

考虑AsyncTask<T1, T2, T3>来自Android系统的API ,它提供了三个钩子:

class AsyncTask<S, T, V> {
  void doInBackground(S...);
  void onProgressUpdate(T...);
  void onPostExecute(V);
}
Run Code Online (Sandbox Code Playgroud)

扩展泛型类型时,AsyncTask<T1, T2, T3>您可能对使用参数进度结果挂钩不感兴趣,因此您的实现将如下所示:

class HTTPDownloader extends AsyncTask<URL, Void, Void> {
  void doInBackground(URL... urls) {}
  void onProgressUpdate(Void... unused) {}
  void onPostExecute(Void unused) {}
}
Run Code Online (Sandbox Code Playgroud)

并且您可以使用null参数调用这些方法,因为Void无法实例化.


Mar*_*nik 6

如果Void实际上并不是类型参数的实例化(它显然是有意义的),那么在声明handle(Void)你的handle方法是否受到一个语言外合同的意义上也是有意义的,该合同表明想要参与某个协议的对象必须实现一个单参数句柄方法,无论实际参数类型如何.现在,可能有一个特殊情况的实现无法处理任何事情,null所以声明handle(Void)这样的实现是有意义的.