[英]What's the difference between Void and no parameter?
我有一個類定義了兩個重載方法
public void handle(Void e)
protected void handle()
顯然他們是不同的,尤其是handle(Void e)
是public
。
這兩者有什么區別?
如何調用第一種方法? 我正在使用handle(null)
- 這是正確的嗎?
Void
是一個通常僅用於反射的特殊類 - 它的主要用途是表示void方法的返回類型。 從的javadoc Void
:
Void類是一個不可實例化的占位符類,用於保存對表示Java關鍵字void的Class對象的引用。
由於無法實例化Void
類,因此可以傳遞給具有Void
類型參數的方法的唯一值handle(Void e)
例如handle(Void e)
為null
。
這是事件的官方版本,但對於那些感興趣的人,盡管在Void
的javadoc中聲稱相反,你實際上可以實例化一個Void
的實例:
Constructor<Void> c = Void.class.getDeclaredConstructor();
c.setAccessible(true);
Void v = c.newInstance(); // Hello sailor!
也就是說,當你想表明類型被“忽略”時,我已經看到Void
“有用”用作通用參數類型,例如:
Callable<Void> ignoreResult = new Callable<Void> () {
public Void call() throws Exception {
// do something
return null; // only possible value for a Void type
}
}
Callable
的通用參數是返回類型,因此當像這樣使用Void
時,即使需要使用Callable
接口,對於代碼的讀者來說,返回值並不重要,這是一個明確的信號,例如,如果使用Executor
框架。
第一個函數是單個參數的函數,必須提供該函數,並且只能有效地取值null
。 除null之外的任何值都不會編譯。 第二個函數不接受任何參數,並且將null
傳遞給它將無法編譯。
考慮來自Android系統的 AsyncTask<T1, T2, T3>
的API,它提供了三個鈎子:
class AsyncTask<S, T, V> {
void doInBackground(S...);
void onProgressUpdate(T...);
void onPostExecute(V);
}
當您擴展泛型類型AsyncTask<T1, T2, T3>
您可能不會對使用參數進行進度和結果掛鈎感興趣,因此您的實現將如下所示:
class HTTPDownloader extends AsyncTask<URL, Void, Void> {
void doInBackground(URL... urls) {}
void onProgressUpdate(Void... unused) {}
void onPostExecute(Void unused) {}
}
並且您可以使用null
參數調用這些方法,因為無法實例化Void
。
如果Void
實際上不是類型參數的實例化(它顯然是有意義的),那么如果你的handle
方法受到一個表示想要參與的對象的語言學合同,那么聲明一個handle(Void)
也是有意義的。在某個協議中必須實現一個參數句柄方法 ,而不管實際的參數類型。 現在,可能有一個特殊情況的實現無法處理除null
任何內容,因此為這樣的實現聲明handle(Void)
是有意義的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.