将SwingWorker的泛型类型设置为void?

时间:2013-01-08 16:34:46

标签: java swing generics void swingworker

  

可能重复:
  What is the difference between java.lang.Void and 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.

但是,当我将代码从void更改为Void(即小v到大写V)时,它工作得很好,尽管我仍然被迫{{ 1}}在return null;方法的末尾。

这是为什么?我知道doInBackground()Void包中的一个类,但文档中没有说太多(至少我不能遵循它:p)

Thanx提前!!

2 个答案:

答案 0 :(得分:12)

class AnswerWorker extends SwingWorker<Void, Void>
应该做的伎俩。 这是因为泛型总是需要对象作为参数。他们也不能采取原始。 Void就像一个摆脱这个问题的包装器。

现在你还需要归还的原因是什么:
正如文档所说,Void仍然是一个类。所以你还需要返回一个对象。由于它是不可实现的,因此只能返回null。因此Voidvoid关键字不完全相同。仍然需要返回对象的引用(在这种情况下为null-reference)。

有一件重要的事情:泛型强迫你使用对象。 void,就像原始类型一样,不是一个对象。这是Java的纯粹oop性质;)

答案 1 :(得分:3)

java.lang.Void类最初是在泛型作为放置常量Void.TYPE,表示Class类型的void对象并返回的对象之前很久才引入的java.lang.reflect.Method.getReturnType()用于void方法(类似于Integer.TYPECharacter.TYPE等,代表intchar,...)。

Void类无法实例化(因此,您可以为Void类型的变量指定的唯一有效值为null)但已被选中因为泛型作为一种有用的标记引入了这样的情况,其中语法需要一个类名,但你真的不想使用它。