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."
- 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? - Jaka jest różnica między
java.lang.Void
avoid
?
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
.
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
?"
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.
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.
Future<Void>
. Na przykład w Google App Engine usługa asynchronicznego magazynu danych delete
operacja zwraca future . When
get () 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>
).
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
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);
}
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();
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