Jest Java Void
- wielkie V-- rodzaj odniesienia . Jedyna sytuacja, jaką kiedykolwiek widziałem, to parametryzacja Callable
s
final Callable<Void> callable = new Callable<Void>() {
public Void call() {
foobar();
return null;
}
};
Czy są jakieś inne zastosowania Void
typu referencyjnego Java ? Czy kiedykolwiek można mu przypisać coś innego niż null
? Jeśli tak, czy masz przykłady?
Odpowiedzi:
Void
stało się konwencją dla ogólnego argumentu, którym nie jesteś zainteresowany. Nie ma powodu, dla którego miałbyś używać innego typu, którego nie można utworzyć instancji, takiego jakSystem
.Jest również często używany na przykład w
Map
wartościach (chociażCollections.newSetFromMap
używaBoolean
jako map nie musi akceptowaćnull
wartości) ijava.security.PrivilegedAction
.Napisałem wpis na blogu
Void
kilka lat temu.źródło
java.lang.Void
. / Josh Bloch spopularyzował konwencję, chociaż raz ją zobaczysz, jest to oczywisty wybór.Możesz stworzyć instancję Void za pomocą odbić, ale nie są one przydatne do niczego. Void to sposób na wskazanie, że metoda ogólna nic nie zwraca.
drukuje coś w rodzaju
źródło
System.exit(0)
). Mam tendencję do pisania klas użytkowych z konstruktorem jakoprivate Void() { throw new Error(); }
. Niektórzy mogą preferować wyliczenie bez wartości.Future<Void>
działa jak urok. :)źródło
Future<?>
, ponieważ przyszłość często będzie miała uzasadnioną wartość (nietypowąVoid
), ale jest używana w kontekście, który nie dba o wartość.CompletableFuture<Void>
działa również jak urok.Biorąc pod uwagę, że nie ma publicznych konstruktorów , powiedziałbym, że nie można mu przypisać niczego innego niż
null
. Użyłem go tylko jako symbolu zastępczego dla „Nie muszę używać tego ogólnego parametru”, jak pokazuje Twój przykład.Można go również wykorzystać do refleksji, z tego, co mówi jego Javadoc :
źródło
Wszystkie pierwotne klasy osłony (
Integer
,Byte
,Boolean
,Double
, itd.) Zawierają odniesienia do odpowiedniej grupy pierwotnej w statycznymTYPE
polu, na przykład:Void
został początkowo utworzony jako miejsce, w którym można umieścić odniesienie dovoid
typu:Jednak tak naprawdę nic nie zyskujesz, używając
Void.TYPE
. Kiedy używaszvoid.class
, jest znacznie wyraźniejsze, że robisz coś zvoid
typem.Na marginesie, kiedy ostatnio go próbowałem, BeanShell nie rozpoznał
void.class
, więc musiszVoid.TYPE
tam użyć .źródło
Kiedy używasz wzorca gościa , bardziej przejrzystym może być użycie Void zamiast Object, gdy chcesz mieć pewność, że zwracana wartość będzie zerowa
Przykład
Kiedy zaimplementujesz swojego gościa, możesz jawnie ustawić OUT jako Void, abyś wiedział, że twój gość zawsze zwróci wartość null, zamiast używać Object
źródło
Przed typami generycznymi został utworzony dla interfejsu API odbicia, aby przechowywać TYPE zwracany przez Method.getReturnType () dla metody void, odpowiadającej innym klasom typów pierwotnych.
EDYCJA: Z JavaDoc of Void: „Klasa Void jest nieinstanowalną klasą zastępczą, która zawiera odniesienie do obiektu Class reprezentującego słowo kluczowe Java void”. Przed pojawieniem się Generics nie zdaję sobie sprawy z niczego innego niż refleksja.
źródło
Void
. Zobacz stackoverflow.com/questions/34248693/…Ponieważ nie możesz utworzyć instancji Void, możesz użyć obiektu Apache commons Null , więc
w pierwszej linii masz obiekt, więc
aNullObject != null
trzyma się, podczas gdy w drugiej linii nie ma odniesienia, więcnoObjectHere == null
trzymaOdpowiadając na pierwotne pytanie autora, celem tego jest odróżnienie „nic” od „niczego”, które są zupełnie różnymi rzeczami.
PS: Powiedz nie wzorowi obiektu o wartości Null
źródło
Pustka jest tworzona, aby owinąć jej prymitywny typ pustki. Każdy typ pierwotny ma odpowiadający mu typ referencyjny. Void służy do tworzenia instancji klasy ogólnej lub użycia metody ogólnej, argumentów ogólnych, którymi nie jesteś zainteresowany. A oto przykład ...
tutaj, jak widzisz, nie chcę niczego od serwera, o który proszę, aby utworzyć nowe rejestracje, ale
public interface AsyncCallback<T> { .... }
jest to interfejs ogólny, więc udostępniam Void, ponieważ typy generyczne nie akceptują typów pierwotnychźródło
Jest również często używany w wywołaniach zwrotnych uzupełniania Async-IO, gdy nie potrzebujesz
Attachment
obiektu. W takim przypadku określasz wartość null w operacji IO i implementujeszCompletionHandler<Integer,Void>
.źródło
Może to być rzadki przypadek, ale kiedyś użyłem
Void
w klasach aspektów.Był to aspekt, który działa po metodach, które mają
@Log
adnotację i rejestruje zwróconą metodę oraz pewne informacje, jeśli typ zwracanej metody nie jest nieważny.źródło