2012-05-31 2 views
45

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

«Пустота класс является классом uninstantiable заполнителя провести ссылки на объект класса, представляющего пустоту ключевого слова Java.»

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

ответ

42

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

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

+0

Благодаря Луи Wasserman.Void.Type можно сказать, "примитивный тип" или любую вещь – user1357722

+0

Подождите, что? Это не правда. 'Void.TYPE' _only_ означает' void'. Это не C. –

+0

Итак, зачем определять класс Void вместо void?. Если любое неправильное извинение – user1357722

80

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

«Но ждать, void не имеет значения!»

Право! Вот что делает java.lang.Void «uninstantiable». :)

Это приятная особенность системы типа Java, в которой каждый примитивный тип имеет эквивалент в штучной упаковке. int имеет Integer, long имеет Long, byte имеет Byte ... и void имеет Void. Было бы странно и асимметрично, если бы у Voidне было.

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

Легко. void - примитивный тип. Void - ссылочный тип, который наследуется от Object. Они похожи, так как ни один из них не имеет каких-либо возможных значений; но тем не менее они представляют собой два очень разных типа, с точки зрения системы типов.

«Но у меня нет пользы для Void в моих программах».

И у меня нет пользы для GarbageCollectorMXBean в моей. Некоторые функции не имеют не-неясное использование. Это нормально.

+18

+1 для удовольствия, но хорошее объяснение! –

+0

Хорошее объяснение. – MKod

+0

Это объяснение сделало мой день ... :) –

39

Наиболее распространенное использование Void предназначено для отражения, но это не единственное место, где оно может быть использовано.

void - это ключевое слово, которое означает, что функция не приводит к значению.

java.lang.Void является ссылочным типом, то справедливо следующее:

Void nil = null; 

(До сих пор это не интересно ...)

Как тип результата (функция с возвращаемым значением тип Void) это означает, что функция * всегда * возвращает null (она не может вернуть ничего, кроме null, потому что у Void нет экземпляров).

Void function(int a, int b) { 
    //do something 
    return 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.

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

+1

Это замечательное объяснение: по существу , Void - это способ статического принуждения к тому, что у типа абсолютно нет возможности вообще что-либо вернуть. Его гораздо более однозначный, чем, например, WeakHashMap , и это то, что вам нужно было бы сделать иначе. – jayunit100

+0

+1 для примеров и понимания использования '' '' '' '' '' '' '' 'Void' для подражания 'Set' s. Тем не менее, 'WeakHashMap'' Void 'не является отличным примером, поскольку такая конструкция не лучше, чем простая« HashSet »(нет выгоды от функциональности« Слабая »). (Интересно, что «HashSet » на самом деле подкрепляется «HashMap ».) –

+1

@Dave, на самом деле они разные, поскольку «WeakHashMap» имеет слабые ссылки на свои ключи (в то время как значения сильно привязаны), но plain 'HashSet' сохраняет ссылки на свои ключи. – Javier

4

Void - это функция AutoBoxing (с JDK 1.5) пустоты.

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

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

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

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

1

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

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

eventChecker.checkCreatedEvent(TestEvents::checkBenefitConcertInCentralPark); 

Метод checkBenefitConcertInCentralPark определяется следующим образом (обратите внимание на использование Пустоты):

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); 
    } 
+0

Вы не объясняете, зачем вам нужна функция, возвращающая Void, а не просто использование Потребителя. –

0

Другой пример использования Void является SwingWorker

new SwingWorker<Void, Integer>() { 
    @Override 
    protected Void doInBackground(){ 
     ... 
    } 
    @Override 
    protected void process(List<Integer> chunk){ 
     ... 
    } 
    @Override 
    public void done(){ 
     ... 
    } 
}.execute(); 
Смежные вопросы