我有一个类定义了两个重载方法
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框架,对于代码的读者来说,返回值并不重要,这是一个明确的信号.
Con*_*ion 42
第一个函数是单个参数的函数,必须提供该函数并且只能有效地获取该值null.除null之外的任何值都不会编译.第二个函数不带任何参数,传递null给它就不会编译.
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无法实例化.
如果Void实际上并不是类型参数的实例化(它显然是有意义的),那么在声明handle(Void)你的handle方法是否受到一个语言外合同的意义上也是有意义的,该合同表明想要参与某个协议的对象必须实现一个单参数句柄方法,无论实际参数类型如何.现在,可能有一个特殊情况的实现无法处理任何事情,null所以声明handle(Void)这样的实现是有意义的.
| 归档时间: |
|
| 查看次数: |
19251 次 |
| 最近记录: |