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, он в основном существует для полноты и очень редкого экземпляра, где вам нужно его для отражения.