8

可能重复:
java.lang.Void 和 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(即 smallv更改为 capital V)时,它工作得很好,尽管我仍然被迫return null;在方法结束时这样做doInBackground()

为什么是这样?我知道Voidjava.lang包中的一个类,但文档并没有说明太多(至少不是我可以遵循的:p)

提前谢谢!!

4

2 回答 2

13

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

现在你仍然需要返回一些东西的原因:
正如文档所说,Void仍然是一个类。所以你仍然需要返回一个对象。由于无法实例化,因此只有返回的可能性null。所以Void并不完全像void关键字。仍然需要返回对对象的引用(在这种情况下为空引用)。

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

于 2013-01-08T17:02:41.853 回答
3

早在泛型之前就引入了该类java.lang.Void,作为放置常量的地方Void.TYPE,该Class对象表示void类型,并由java.lang.reflect.Method.getReturnType()forvoid方法返回(类似于表示 , , ... 的 ,Integer.TYPE等)。Character.TYPEintchar

该类Void无法实例化(因此您可以分配给类型变量的唯一有效值Voidnull),但自从引入泛型以来,它已被选为一个有用的标记,用于语法需要类名的情况但你真的不想使用一个。

于 2013-01-08T17:18:45.690 回答