簡體   English   中英

Void與無參數之間有什么區別?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM