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.

しかし、コードをvoidto からVoid(つまり smallvから capital に) 変更すると、問題なく動作しましたが、メソッドの最後でV強制されました。return null;doInBackground()

どうしてこれなの?Voidパッケージ内のクラスであることは知ってjava.langいますが、ドキュメントにはそれについてあまり書かれていません(少なくとも、私が従うことができるものではありません:p)

事前にサンクス!!

4

2 に答える 2

13

class AnswerWorker extends SwingWorker<Void, Void>
トリックを行う必要があります。これは、ジェネリックが常にパラメーターとしてオブジェクトを必要とするためです。また、プリミティブを取ることはできません。Voidは、この問題を取り除くためのラッパーのようなものです。

さて、あなたがまだ何かを返す必要がある理由:
ドキュメントが言うように、それVoidはまだクラスです。したがって、オブジェクトを返す必要があります。インスタンス化できないため、戻る可能性のみがありnullます。だから、キーワードVoidが完全に好きではありません。voidオブジェクトへの参照(この場合はnull参照)を返す必要があります。

重要なことが1つあります。ジェネリックスでは、オブジェクトを使用する必要があります。 void、プリミティブ型のように、オブジェクトではありません。これがJavaの純粋なoopの性質です;)

于 2013-01-08T17:02:41.853 に答える
3

このクラスは元々、ジェネリックスよりずっと前に、型を表すオブジェクトであるjava.lang.Void定数を置く場所として導入されましたVoid.TYPE。このオブジェクトは、メソッドに対して返されます( 、、などを表す、、などに類似しています)。Classvoidjava.lang.reflect.Method.getReturnType()voidInteger.TYPECharacter.TYPEintchar

Voidクラスをインスタンス化することはできません(したがって、型の変数に割り当てることができる唯一の有効な値はVoidですnull)が、構文にクラス名が必要なこのような状況で有用なトークンとしてジェネリックスが導入されて以来、このクラスが採用されています。しかし、あなたは本当にそれを使いたくありません。

于 2013-01-08T17:18:45.690 に答える