Существует Java Void
- прописной V-- ссылочный тип . Единственная ситуация , которую я когда - либо видел , как это используется параметризация Callable
сек
final Callable<Void> callable = new Callable<Void>() {
public Void call() {
foobar();
return null;
}
};
Существуют ли другие способы использования Void
ссылочного типа Java ? Можно ли когда-нибудь назначить что-то кроме null
? Если да, у вас есть примеры?
Ответы:
Void
стало соглашением для общего аргумента, который вас не интересует. Нет никаких причин, по которым вы должны использовать любой другой неинстанцируемый тип, такой какSystem
.Это также часто используется, например, в
Map
значениях (хотяCollections.newSetFromMap
использование вBoolean
качестве карт не должно приниматьnull
значения) иjava.security.PrivilegedAction
.Я написал запись раздела на
Void
несколько лет назад.источник
java.lang.Void
. / Джош Блох популяризировал соглашение, хотя, как только вы его увидели, это очевидный выбор.Вы можете создать экземпляр Void, используя отражения, но они бесполезны ни для чего. Void - это способ указать, что универсальный метод ничего не возвращает.
печатает что-то вроде
источник
System.exit(0)
). Я склонен писать вспомогательные классы с конструктором какprivate Void() { throw new Error(); }
. Некоторые могут предпочесть перечисление без значения.Future<Void>
работает как шарм. :)источник
Future<?>
, поскольку будущее часто будет иметь законное значение (неVoid
типового), но используется в контексте, который не заботится о значении.CompletableFuture<Void>
работает как шарм.Учитывая, что нет открытых конструкторов , я бы сказал, что нельзя назначить ничего, кроме
null
. Я использовал его только как заполнитель для «мне не нужно использовать этот универсальный параметр», как показывает ваш пример.Это может также использоваться в рефлексии, из того, что говорит его Javadoc :
источник
Все примитивные классы обертки (
Integer
,Byte
,Boolean
,Double
и т.д.) содержат ссылку на соответствующем примитивный класс в статическомTYPE
поле, например:Void
Первоначально был создан как-то, чтобы поместить ссылку наvoid
тип:Тем не менее, вы ничего не получите с помощью
Void.TYPE
. Когда вы используете,void.class
становится намного понятнее, что вы делаете что-то сvoid
типом.Кроме того, в последний раз, когда я пробовал это, BeanShell не распознавал
void.class
, так что вы должны использоватьVoid.TYPE
там.источник
Когда вы используете шаблон посетителя, может быть лучше использовать Void вместо Object, если вы хотите быть уверены, что возвращаемое значение будет нулевым
пример
Когда вы реализуете своего посетителя, вы можете явно установить для OUT значение Void, чтобы вы знали, что ваш посетитель всегда будет возвращать ноль вместо использования Object
источник
До обобщения это было создано для API отражения, чтобы содержать TYPE, возвращаемый Method.getReturnType () для метода void, соответствующего другим классам примитивных типов.
РЕДАКТИРОВАТЬ: Из JavaDoc Void: «Класс Void является нереализуемым классом-заполнителем для хранения ссылки на объект Class, представляющий ключевое слово Java void». До Generics я не знаю ничего, кроме размышлений.
источник
Void
. Пожалуйста, смотрите stackoverflow.com/questions/34248693/…Поскольку вы не можете создать экземпляр Void, вы можете использовать Apache commons Null object , поэтому
в первой строке у вас есть объект, так что
aNullObject != null
держит, в то время как во второй строке нет ссылки, поэтомуnoObjectHere == null
держитЧтобы ответить на оригинальный вопрос автора, для этого нужно различать «ничто» и «ничто», которые являются совершенно разными вещами.
PS: Скажи нет объектному образцу Null
источник
Void - это создание, чтобы обернуть свой примитивный тип void. Каждый тип примитива имеет соответствующий тип ссылки. Void используется для создания экземпляра универсального класса или использования универсального метода. Универсальные аргументы, которые вас не интересуют. Вот пример ...
здесь, как вы можете видеть, я не хочу ничего от сервера, который я запрашиваю для создания новых регистраций, но
public interface AsyncCallback<T> { .... }
это универсальный интерфейс, поэтому я предоставляю Void, поскольку универсальные шаблоны не принимают примитивные типыисточник
Он также обычно используется в обратных вызовах завершения Async-IO, когда у вас нет необходимости в
Attachment
объекте. В этом случае вы указываете null для операции ввода-вывода и реализуетеCompletionHandler<Integer,Void>
.источник
Это может быть редким случаем, но однажды я использовал
Void
в классах аспектов.Это был аспект, который запускается после методов с
@Log
аннотацией и регистрирует возвращенный метод и некоторую информацию, если тип возвращаемого метода не void.источник