Jaka jest różnica między Javą.lang.Pustka i pustka?

W API

"Klasa Void jest uninstantiable placeholder class to hold a odniesienie do obiektu klasy reprezentującego słowo kluczowe Java void."

  1. Co to jest klasa" uninstantiable " place holder? Kiedy będzie używany java.lang.Void? Jeśli klasa jest "niepodważalna", jaki to ma sens?
  2. Jaka jest różnica między java.lang.Void a void?
 52
Author: Radu Murzea, 2012-05-31

6 answers

jedynym punktem z Void jest przytrzymanie Void.TYPE, co jest podobne do void.class. Jeśli masz refleksyjne odniesienie do metody, która zwraca void i otrzymasz jej typ return, zwróci ona Void.TYPE.

Nie możesz i nie powinieneś używać go do niczego innego.
 45
Author: Louis Wasserman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-31 18:19:53

java.lang.Void jest analogiczny do java.lang.Integer. {[2] } jest sposobem boksu wartości typu prymitywnego int. Void jest sposobem boksu wartości typu prymitywnego void.

"ale czekaj, void nie ma żadnych możliwych wartości!"

Racja! To właśnie sprawia, że java.lang.Void jest "niepodważalny". :)

To fajna cecha systemu typu Java, że każdy prymitywny typ ma pudełkowy odpowiednik. int ma Integer, long mA Long, byte has Byte... i void ma Void. Byłoby dziwne i asymetryczne Jeśli Void nie istniał.

"więc jaka jest różnica między java.lang.Void a void?"

Spokojnie. void jest typem prymitywnym. Void jest typem odniesienia, który dziedziczy z Object. Są podobne pod tym względem, że żaden z nich nie ma żadnych możliwych wartości; niemniej jednak są to dwa bardzo różne typy, z punktu widzenia systemu typów.

"ale nie mam żadnego zastosowania do Void w moich programach."

I nie mam zastosowania do GarbageCollectorMXBean w moje. Niektóre funkcje nie mają nie-niejasnych zastosowań. W porządku.

 86
Author: Quuxplusone,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-27 22:00:48

Najczęściej używa się Void do refleksji, ale nie jest to jedyne miejsce, w którym można go użyć.

void jest słowem kluczowym, które oznacza, że funkcja nie daje wartości.

java.lang.Void jest typem odniesienia, wtedy ważne jest, co następuje:

 Void nil = null;

(Jak na razie nie jest to ciekawe...)

Jako typ wynikowy (funkcja o zwracanej wartości typu Void) oznacza to, że funkcja *zawsze * zwraca null (nie może zwrócić niczego innego niż null, ponieważ Void nie ma instancji).

 Void function(int a, int b) {
    //do something
    return null;
 }

Po co mi funkcja, która zawsze zwraca null?

Przed wynalezieniem leków generycznych, nie miałem przypadku użycia Void.

W przypadku leków generycznych jest kilka interesujących przypadków. Na przykład Future<T> jest uchwytem na wynik asynchronicznej operacji wykonywanej przez inny wątek. Future.get zwróci wartość operacji (typu T) i zablokuje do momentu obliczenia jest wykonywana.

Ale... A jeśli nie ma nic do powrotu? Proste: użyj Future<Void>. Na przykład w Google App Engine usługa asynchronicznego magazynu danych delete operacja zwraca future . Whenget () is invoked on that future,null` jest zwracane po zakończeniu usuwania. Można napisać podobny przykład za pomocą Callable s.

Innym przypadkiem użycia jest Map bez wartości, tj. a Map<T,Void>. Taka mapa zachowuje się jak Set<T>, wtedy może być przydatna, gdy nie ma równoważnej implementacji Set (np. nie ma WeakHashSet, wtedy można by użyć WeakHashMap<T,Void>).

 44
Author: Javier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-23 13:43:35
Void jest funkcją Autoboxingu (od JDK 1.5) void.

Cóż, to oczywiste, że Void jest odniesieniem, podczas gdy void jest Typ prymitywny.

Gdzie więc pojawia się wymóg użycia Void ???

Jedno powszechne użycie z typami generycznymi, gdzie nie możemy używać prymitywnych.

Say, in case of Android AsyncTaks<Params, Progress, Result> what if I nie chcesz otrzymywać aktualizacji postępu. I can ' t use void (primitive type) tutaj wymagamy Javy.lang.Void

 4
Author: Amit Yadav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-19 16:05:40

Void jest przydatny, ponieważ czasami trzeba określić typ zwracanej metody poza samą metodą.

Weźmy na przykład java 8 wyrażenie lambda , które sprawdza, czy obiekt EventResource ma określone właściwości, używając metody o nazwie checkBenefitConcertInCentralPark, przekazanej do metody checkCreatedEvent:

eventChecker.checkCreatedEvent(TestEvents::checkBenefitConcertInCentralPark);

Metoda checkBenefitConcertInCentralPark jest zdefiniowana w następujący sposób (zwróć uwagę na użycie Void):

    public static Void checkBenefitConcertInCentralPark(EventResource eventResource) { 
        // JUnit code here...
        // assertThat(blablabla  :)  )

        return null; // we can only return null at the end of a method when returning Void
    }

A następnie Metoda checkBenefitConcertInCentralPark jest przekazywana do metody checkCreatedEvent.

    // Function<EventResource, Void> describes the checkBenefitConcertInCentralPark method
    public void checkCreatedEvent(Function<EventResource, Void> function) { 
        function.apply(this.eventResource);
    }
 1
Author: John Deverall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-23 11:03:02

Innym przykładem użycia Void jest SwingWorker

new SwingWorker<Void, Integer> () {
    @Override
    protected Void doInBackground(){
        ...
    }
    @Override
    protected void process(List<Integer> chunk){
        ...
    }
    @Override
    public void done(){
        ...
    }
}.execute();
 1
Author: Maxwell Cheng,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-02 21:32:05