Java.lang.Void vs void vs Null
В чем именно разница между 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"
Ответы
Ответ 1
У вас есть дополнительная запятая в вашем коде.
myAsyncTask.execute((Void),null);
//^extra comma right here
Кроме того, нет необходимости бросать null
в Void
, потому что (1) Void
не имеет экземпляров и, следовательно, нет объекта Void
и (2) литье null
на что угодно скорее бесполезно, поскольку null является допустимым значением для любого типа данных объекта.
Код должен быть просто:
myAsyncTask.execute(null);
Ответ 2
Наиболее частое использование 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
возвращает Future<Void>
. Когда get()
вызывается в этом будущем, null
возвращается после, удаление завершено. Можно написать аналогичный пример с Callable s.
Другим вариантом использования является Map
без значений, т.е. a Map<T,Void>
. Такая карта ведет себя как a Set<T>
, тогда она может быть полезна, когда нет эквивалентной реализации Set
(например, нет WeakHashSet
, тогда можно использовать WeakHashMap<T,Void>
).
Ответ 3
Void
- это "неинтегрируемый класс-заполнитель, чтобы содержать ссылку на объект класса, представляющий ключевое слово void". (от http://docs.oracle.com/javase/6/docs/api/java/lang/Void.html)
Void
- это возвращаемый тип, который не означает возврата.
null
- отсутствие значения.
Ответ 4
java.lang.Void
представляет собой коробчатое представление типа void
. Поскольку вы не можете иметь экземпляр типа void
, он в основном существует для полноты и очень редкого экземпляра, где вам нужно его для отражения.