Подтвердить что ты не робот

В чем разница между java.lang.Void и void?

В API

"Класс Void - это неинтересный класс-заполнитель для хранения ссылка на объект класса, представляющий ключевое слово void."

  • Что такое "нежизнеспособный" класс владельца места? Когда будет использоваться java.lang.Void? Если класс "неинстантируемый", какой он использует?
  • В чем разница между java.lang.Void и void?
4b9b3361

Ответ 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();