В чем разница между java.lang.Void и void?
В API
"Класс Void - это неинтересный класс-заполнитель для хранения ссылка на объект класса, представляющий ключевое слово void."
- Что такое "нежизнеспособный" класс владельца места? Когда будет использоваться
java.lang.Void
? Если класс "неинстантируемый", какой он использует?
- В чем разница между
java.lang.Void
и void
?
Ответы
Ответ 1
Единственной точкой Void
является удерживание Void.TYPE
, что похоже на void.class
. Если у вас есть отражающая ссылка на метод, который возвращает Void
, и вы получите его возвращаемый тип, он вернет Void.TYPE
.
Вы не можете и не должны использовать его для чего-либо еще.
Ответ 2
java.lang.Void
аналогичен java.lang.Integer
. Integer
- это способ боксирования значений примитивного типа int
. Void
- это способ боксирования значений примитивного типа Void
.
"Но подождите, Void
не имеет никаких возможных значений!"
Right! Что делает java.lang.Void
"неинстанционным".:)
Это приятная особенность системы типа Java, в которой каждый примитивный тип имеет эквивалент в штучной упаковке. int
имеет Integer
, long
имеет long
, byte
имеет byte
... и Void
имеет Void
. Было бы странно и асимметрично, если Void
не существовало.
"Итак, какая разница между java.lang.Void
и Void
?"
Легко. Void
является примитивным типом. Void
является ссылочным типом, который наследуется от Object
. Они похожи, так как ни один из них не имеет каких-либо возможных значений; но тем не менее они представляют собой два очень разных типа, с точки зрения системы типов.
"Но в моих программах я не использую Void
.
И я не использую для GarbageCollectorMXBean
в моем. Некоторые функции не имеют непонятных применений. Это хорошо.
Ответ 3
Наиболее частое использование Void
- это отражение, но это не единственное место, где оно может быть использовано.
Void
- это ключевое слово, которое означает, что функция не приводит к значению.
java.lang.Void
является ссылочным типом, тогда справедливо следующее:
Void nil = null;
(Пока это не интересно...)
В результате тип (функция с возвращаемым значением типа Void
) означает, что функция * всегда * возвращает null
(она не может вернуть ничего, кроме null
, потому что Void
не имеет экземпляров).
Void function(int a, int b) {
//do something
return null;
}
Почему мне нужна функция, которая всегда возвращает null?
До изобретения дженериков у меня не было использования для Void
.
С дженериками есть несколько интересных случаев. Например, Future<T>
является держателем для результата асинхронной операции, выполняемой другим потоком. Future.get
вернет рабочее значение (типа T
) и будет блокироваться до тех пор, пока не будет выполнено вычисление.
Но... Что, если нечего возвращать? Просто: используйте Future<Void>
. Например, в Google App Engine служба Asyncronous Datastore Service delete
возвращает следующий . When
get() is invoked on that future,
null` после удаление завершено. Можно написать аналогичный пример с Callable s.
Другим вариантом использования является Map
без значений, т.е. a Map<T,Void>
. Такая карта ведет себя как a Set<T>
, тогда она может быть полезна, когда нет эквивалентной реализации Set
(например, нет WeakHashSet
, то можно использовать WeakHashMap<T,Void>
).
Ответ 4
Void - это функция AutoBoxing (начиная с JDK 1.5) void.
хорошо, что он сам объясняет, что Void является ссылкой, тогда как void является примитивный тип.
Итак, когда требование требует использования Void???
Одно общее использование с родовыми типами, где мы не можем использовать примитив.
Скажем, в случае Android AsyncTaks<Params, Progress, Result>
что, если я не хотите получать обновление Progress. Я не могу использовать void (примитивный тип) здесь нам требуется java.lang.Void
Ответ 5
Void полезен, потому что иногда вам нужно указать возвращаемый тип метода вне самого метода.
Например, возьмите java 8 lambda expression, который проверяет, имеет ли объект EventResource определенные свойства, используя метод с именем checkBenefitConcertInCentralPark
, переданный в метод checkCreatedEvent
:
eventChecker.checkCreatedEvent(TestEvents::checkBenefitConcertInCentralPark);
Метод checkBenefitConcertInCentralPark
определяется следующим образом (обратите внимание на использование 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
}
а затем метод checkBenefitConcertInCentralPark
передается в метод checkCreatedEvent
.
// Function<EventResource, Void> describes the checkBenefitConcertInCentralPark method
public void checkCreatedEvent(Function<EventResource, Void> function) {
function.apply(this.eventResource);
}
Ответ 6
Другим примером использования Void
является SwingWorker
new SwingWorker<Void, Integer> () {
@Override
protected Void doInBackground(){
...
}
@Override
protected void process(List<Integer> chunk){
...
}
@Override
public void done(){
...
}
}.execute();