2013-01-08 25 views
6

Possible Duplicate:
What is the difference between java.lang.Void and void?將泛型類型的SwingWorker設置爲void?

我想創造一個具體的類SwingWorker兩者最終和中間結果類型作爲void。我寫了下面的代碼:

class AnswerWorker extends SwingWorker<void, void> { 
    protected void doInBackGround() { 
     System.out.println("what is your problem!!"); 
    } 
} 

這給了我以下錯誤:

Multiple markers at this line- 
    Syntax error on token "void", Dimensions expected after this token. 
    Syntax error on token "void", Dimensions expected after this token. 

然而,當我從voidVoid(即小v資本V),它工作得很好改變了代碼,儘管我仍然被迫在doInBackground()方法的末尾return null;

這是爲什麼?我知道Voidjava.lang包中的一個類,但文檔中沒有提到太多內容(至少不是我可以遵循的:p)

Thanx提前!

+0

重要的可能是兩個參數,是否真的有 mKorbel

回答

11

class AnswerWorker extends SwingWorker<Void, Void>
應該這樣做。 這是因爲泛型總是需要對象作爲參數。他們也不能拿原始人。 Void就像是一個包裝來擺脫這個問題。

現在的原因,爲什麼你還需要返回的東西:
由於文件說,Void仍然是一類。所以你仍然需要返回一個對象。由於這是無法證實的,只有返回null的可能性。因此Voidvoid關鍵字不完全相同。仍然需要返回對象的引用(在這種情況下爲null引用)。

還有一件重要的事情:泛型強迫你使用對象。與原始類型一樣,void不是一個對象。這是Java的純面向對象的性質;)

3

java.lang.Void類最初引起的長泛型以前那樣把不斷Void.TYPE,將Class對象,表示void類型的地方,這是由java.lang.reflect.Method.getReturnType()void方法(返回通過類比Integer.TYPECharacter.TYPE等,其代表intchar,...)。

Void類不能被實例化(因此可以分配給Void類型的變量的唯一有效值爲null),但它已由於引入泛型作爲一個有用的令牌這樣的情況下共同選擇這裏的語法需要一個類名,但你並不想使用它。

+0

你能指點我一些官方/權威性的文件來證實這個句子在'SwingWorker'的背景下嗎?_it已經被引入泛型後被增選爲這是一個有用的標記,用於類似這樣的情況,其中語法需要類名,但您並不想使用one_。 –

+0

@JaimeHablutzel我不能,我選擇了術語「增選」暗示它是一個非官方的慣例,而不是一個正式的建議。如果你總是返回null,那麼你使用的是什麼類並不重要,但是'Void'是一個有用的約定。 ['java.util.concurrent.RecursiveAction'](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/RecursiveAction.html)使用了相同的約定,它是一個「無結果「的'ForkJoinTask'總是返回'null',所以它擴展了'ForkJoinTask '。 –

+0

使用'Void'這樣的標準Java API中有一個類似這樣的事實似乎是對我的正式引用。謝謝!。 –

相關問題