В чем разница между Java.ленг.Пустота и пустота?



в API




"пустота классе является uninstantiable класс заполнитель для проведения
ссылка на объект класса, представляющий ключевое слово Java void."





  1. что такое "uninstantiable" держатель места класса? Когда будет java.lang.Void использоваться? Если класс "деинсталлируется", какой от него прок?

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

428   6  

6 ответов:

The только точки на Void провести Void.TYPE, что-то вроде void.class. Если у вас есть отражающая ссылка на метод, который возвращает void, и вы получите его тип возврата, он вернется Void.TYPE.

вы не можете и не должны использовать его ни для чего другого.

java.lang.Void аналогично java.lang.Integer. Integer это способ боксирования значений примитивного типа int. Void это способ боксирования значений примитивного типа void.

.

наиболее распространенное использование 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 Datastoredelete операция возвращает будущее. When get ()is invoked on that future,значение null возвращается после удаление завершено. Можно было бы написать аналогичный пример с вызвать s.

другой вариант использования-это Map без значений, т. е. a Map<T,Void>. Такая карта ведет себя как Set<T>, то это может быть полезно, когда нет эквивалентного реализации Set (например, нет WeakHashSet, тогда можно было бы использовать WeakHashMap<T,Void>).

Void-это функция автобокса (начиная с JDK 1.5) void.

ну его самоочевидно, что пустота является ссылкой, тогда как пустота является примитивный тип.

Итак, где требование приходит, чтобы использовать Void ???

одно общее использование с универсальными типами, где мы не можем использовать примитив.

скажем, в случае Android AsyncTaks<Params, Progress, Result> что если я не хочу, чтобы получить обновление прогресса. Я не могу использовать void (примитивный тип) здесь мы требуем Ява.ленг.Пустота

Void полезно, потому что иногда вам нужно указать тип возврата метода вне самого метода.

например, возьмите это java 8 лямбда-выражение, который проверяет, имеет ли объект EventResource определенные свойства, используя метод с именем checkBenefitConcertInCentralPark, передано в метод checkCreatedEvent:

eventChecker.checkCreatedEvent(TestEvents::checkBenefitConcertInCentralPark);

The 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
    }

а то метод в метод checkCreatedEvent.

    // Function<EventResource, Void> describes the checkBenefitConcertInCentralPark method
    public void checkCreatedEvent(Function<EventResource, Void> function) { 
        function.apply(this.eventResource);
    }

еще один пример использования Void и SwingWorker

new SwingWorker<Void, Integer> () {
    @Override
    protected Void doInBackground(){
        ...
    }
    @Override
    protected void process(List<Integer> chunk){
        ...
    }
    @Override
    public void done(){
        ...
    }
}.execute();

Comments

    Ничего не найдено.