可能重复:
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提前!!
答案 0 :(得分:12)
class AnswerWorker extends SwingWorker<Void, Void>
应该做的伎俩。
这是因为泛型总是需要对象作为参数。他们也不能采取原始。 Void就像一个摆脱这个问题的包装器。
现在你还需要归还的原因是什么:
正如文档所说,Void
仍然是一个类。所以你还需要返回一个对象。由于它是不可实现的,因此只能返回null
。因此Void
与void
关键字不完全相同。仍然需要返回对象的引用(在这种情况下为null-reference)。
有一件重要的事情:泛型强迫你使用对象。 void
,就像原始类型一样,不是一个对象。这是Java的纯粹oop性质;)
答案 1 :(得分:3)
java.lang.Void
类最初是在泛型作为放置常量Void.TYPE
,表示Class
类型的void
对象并返回的对象之前很久才引入的java.lang.reflect.Method.getReturnType()
用于void
方法(类似于Integer.TYPE
,Character.TYPE
等,代表int
,char
,...)。
Void
类无法实例化(因此,您可以为Void
类型的变量指定的唯一有效值为null
)但已被选中因为泛型作为一种有用的标记引入了这样的情况,其中语法需要一个类名,但你真的不想使用它。