2013-01-08 26 views
6

Possible Duplicate:
What is the difference between java.lang.Void and void?Ustawianie typowych typów SwingWorker jako pustych?

Chciałem stworzyć konkretną klasę dla SwingWorker z obu typów pośrednich i końcowych wyników jak void. I napisał następujący kod:

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

To dało mi następujący błąd:

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. 

Jednak kiedy zmienił kod z void do Void (czyli mała v do kapitału V), to działało w porządku, chociaż wciąż byłem zmuszony do return null; na końcu metody doInBackground().

Dlaczego tak jest? Wiem, że Void jest klasą w pakiecie java.lang, ale dokumentacja niewiele o tym mówi (przynajmniej nie to, co mógłbym zrobić: p)

Z góry !!

+0

i ważne mogą być dwa parametry, czy naprawdę istnieje mKorbel

Odpowiedz

11

class AnswerWorker extends SwingWorker<Void, Void>
Powinien załatwić sprawę. Dzieje się tak, ponieważ generics zawsze potrzebuje obiektów jako parametrów. Nie mogą również brać prymitywów. Void jest jak Wrapper, aby pozbyć się tego problemu.

Teraz powód, dla którego nadal trzeba coś zwrócić:
Zgodnie z dokumentacją, Void nadal jest klasą. Musisz więc zwrócić obiekt. Ponieważ jest nieusuwalny, istnieje tylko możliwość zwrotu null. Tak więc Void nie jest w pełni podobne do słowa kluczowego void. Nadal istnieje potrzeba zwrócenia odwołania do obiektu (w tym przypadku odwołanie do wartości zerowej).

Jest jedna ważna rzecz: Generics zmuszają cię do używania obiektów.void, podobnie jak typy pierwotne, nie jest obiektem. To czysta oop charakter Java;)

3

Klasa java.lang.Void został pierwotnie wprowadzony długo zanim rodzajowych jako miejsce umieścić stałą Void.TYPE, obiekt Class że reprezentuje typ void, i który jest zwracany przez java.lang.reflect.Method.getReturnType() dla void metod (przez analogię do Integer.TYPE, Character.TYPE, itp., które reprezentują int, , ...).

Klasa Void nie może być instancja (dlatego ważne tylko wartość można przypisać do zmiennej typu Void jest null) ale został dokooptowanych od wprowadzenia leków generycznych jako użytecznego tokena dla tego typu sytuacjach gdzie składnia wymaga nazwy klasy, ale tak naprawdę nie chcesz jej używać.

+0

Czy mógłbyś wskazać mi jakąś oficjalną/autorytatywną dokumentację potwierdzającą to zdanie w kontekście 'SwingWorker'? _ Została przyjęta od czasu wprowadzenia leków generycznych jako przydatny token do takich sytuacji, w których składnia wymaga nazwy klasy, ale tak naprawdę nie chcesz używać one_. –

+0

@JimeimeHablutzel Nie mogę, wybrałem termin "dokooptowany", aby sugerować, że jest to nieoficjalna konwencja, a nie oficjalne zalecenie.Jeśli zawsze zwrócisz 'null', to nie ma znaczenia, której klasy używasz, ale' Void' jest użyteczną konwencją. Ta sama konwencja jest używana przez ['java.util.concurrent.RecursiveAction'] (https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/RecursiveAction.html), jest to" bezcelowe "' ForkJoinTask', które zawsze zwraca 'null', więc rozszerza' ForkJoinTask '. –

+0

fakt, że istnieje klasa w standardowym interfejsie API języka Java używająca takiego pustki, wydaje się dość oficjalnym odniesieniem do mnie. Dzięki!. –