java.lang.Void против пустоты против нуля

В чем именно разница между Void, void и могу ли я просто использовать вместо них null?

Я спрашиваю это, потому что я смотрю пример кода Android, где они использовали Void, но на нем были ошибки Eclipse (там написано Void cannot be resolved to a variable).

Мой код, который ломается,

public class MyAsyncTask extends AsyncTask<Void, Void, Boolean>{
    ...
}

Я использую это так

MyAsyncTask myAsyncTask = new MyAsyncTask();
myAsyncTask.execute((Void),null);//this is the line that breaks  "Void cannot be resolved to a variable"

person Josh    schedule 21.03.2013    source источник
comment
Было бы полезно, если бы мы могли видеть код, который ломался.   -  person Louis Wasserman    schedule 21.03.2013
comment
Я собираюсь добавить небольшой фрагмент. просто почистить это   -  person Josh    schedule 21.03.2013
comment
кстати, вы также можете попробовать myAsyncTask.execute(new Void[1]); = Д   -  person Protect Life Save Forests    schedule 29.12.2013
comment
Типа Null нет.   -  person shmosel    schedule 03.07.2017
comment
@shmosel Справедливо, но хотя технически это неверно, вопрос был именно об этом, поэтому я считаю, что это правильный заголовок, поэтому я одобрил редактирование, но изменил заголовок обратно на исходный Null   -  person Josh    schedule 03.07.2017
comment
см. также stackoverflow.com/questions/10839042/   -  person blueberryfields    schedule 15.07.2021


Ответы (5)


У вас есть лишняя запятая в вашем коде.

myAsyncTask.execute((Void),null);
                        //^extra comma right here

Кроме того, нет необходимости приводить null к Void, потому что (1) Void не имеет экземпляров и, следовательно, нет объекта Void, и (2) приведение null к чему-либо довольно бесполезно, поскольку null является допустимым значением для любого типа данных Object. .

Код, вероятно, должен быть просто:

myAsyncTask.execute(null);
person jedyobidan    schedule 21.03.2013
comment
это была лишняя запятая Спасибо! я не понял, что это приведение (я думал, что это два аргумента), но по какой-то причине его нужно приводить, иначе он выдает ошибку, говоря execute(void[]) is ambiguous for the type MyAsyncTask - person Josh; 21.03.2013
comment
Самая безопасная ставка в этом случае на самом деле myAsyncTask.execute(); - person battery; 30.05.2014

Самое распространенное использование 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 служба асинхронного хранилища данных delete возвращает Future<Void>. Когда get() вызывается для этого будущего, null возвращается после завершения удаления. Можно написать аналогичный пример с Callable с.

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

person Javier    schedule 21.03.2013

Void — это «неопределяемый класс-заполнитель для хранения ссылки на объект Class, представляющий ключевое слово Java void». (из http://docs.oracle.com/javase/6/docs/api/java/lang/Void.html)

void — тип возвращаемого значения, означающий отсутствие возврата.

null - это отсутствие значения.

person Daedalus    schedule 21.03.2013

java.lang.Void — это коробочное представление типа void. Поскольку у вас не может быть экземпляра типа void, он в основном используется для полноты и в очень редких случаях, когда он вам нужен для отражения.

person Wug    schedule 21.03.2013
comment
java.lang.Void не является коробочным представлением void. Называя это представлением в штучной упаковке, подразумевает, что вы оборачиваете примитив. void не является ни примитивом, ни даже типом, и переноса не происходит. - person Jeffrey; 21.03.2013
comment
Некоторые ресурсы, такие как idevelopment.info/data/Programming/java/miscellaneous_java /, укажите void как примитивный тип. Это точно не класс. Вся его цель состоит в том, чтобы заменить примитивный тип эквивалентной цели, что на самом деле и делают коробочные представления. - person Wug; 21.03.2013
comment
Спецификация языка Java утверждает, что void не является типом. - person Jeffrey; 22.03.2013
comment
это интересно. так как, когда я смотрю на код для класса Void, я вижу public static final Class<Void> TYPE = (Class<Void>) Class.getPrimitiveClass("void");, какие типы показывают, что пустота считается примитивным типом. - person Reza; 10.08.2018

void: ключевое слово java указывает, что метод ничего не вернет. Используется для методов

Void : Обертка вокруг пустоты. Он расширяет класс Object.

Необходимо, поскольку Generic не поддерживает примитивные типы данных. (пустота, считающаяся примитивной, является сложным случаем, но это просто объяснение)

Следует использовать для отражения

Constructor<Void> constructor = Void.class.getConstructor()

null указывает на отсутствие значений. Используется для объектов в качестве сравнения с void, который используется для методов.

person subodhkarwa    schedule 01.04.2020