Используется для ссылочного типа Java Void?

Существует Java Void - верхний регистр V-- тип ссылки. Единственная ситуация, которую я когда-либо видел, это параметризация Callable

final Callable<Void> callable = new Callable<Void>() {
            public Void call() {
                foobar();
                return null;
            }
        };

Существуют ли другие типы использования для ссылочного типа Java Void? Может ли когда-нибудь назначаться что-либо кроме null? Если да, есть ли у вас примеры?

Ответ 1

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

Он также часто используется в примерах Map (хотя Collections.newSetFromMap использует Boolean, поскольку карты не должны принимать значения null) и java.security.PrivilegedAction.

Я написал запись в блоге на Void несколько лет назад.

Ответ 2

Вы можете создать экземпляр Void с помощью отражений, но они ничего не полезны. Void - это способ указать, что общий метод ничего не возвращает.

Constructor<Void> constructor = Void.class.getDeclaredConstructor();
constructor.setAccessible(true);
Void v = constructor.newInstance();
System.out.println("I have a " + v);

печатает что-то вроде

I have a [email protected]

Ответ 3

Future<Void> работает как шарм.:)

Ответ 4

Учитывая, что нет публичных конструкторов, я бы сказал, что ему нельзя назначить ничего, кроме null. Я использовал его только как заполнитель для "Мне не нужно использовать этот общий параметр", как показывает ваш пример.

Он также может быть использован в отражении, из чего его Javadoc говорит:

Класс Void является неинтересным классом-заполнителем для ссылки на объект класса, представляющий ключевое слово void.

Ответ 5

Все примитивные классы-оболочки (Integer, Byte, Boolean, Double и т.д.) содержат ссылку на соответствующий примитивный класс в статическом поле TYPE, например:

Integer.TYPE == int.class
Byte.TYPE == byte.class
Boolean.TYPE == boolean.class
Double.TYPE == double.class

Void был первоначально создан как где-то, чтобы поместить ссылку на тип Void:

Void.TYPE == void.class

Однако вы ничего не получаете, используя Void.TYPE. Когда вы используете void.class, гораздо понятнее, что вы что-то делаете с типом Void.

Как и в прошлом, в прошлый раз, когда я попробовал, BeanShell не распознал void.class, поэтому вам нужно использовать Void.TYPE там.

Ответ 6

Когда вы используете шаблон , может быть более чистым использовать Void вместо Object, если вы хотите быть уверены, что возвращаемое значение будет null

Пример

public interface LeavesVisitor<OUT>
{
   OUT visit(Leaf1 leaf);

   OUT visit(Leaf2 leaf);
}

Когда вы реализуете своего посетителя, вы можете явно установить OUT как Void, чтобы вы знали, что ваш посетитель всегда будет возвращать null, вместо использования Object

public class MyVoidVisitor implements LeavesVisitor<Void>
{
    Void visit(Leaf1 leaf){
        //...do what you want on your leaf
        return null;
    }

    Void visit(Leaf2 leaf){
        //...do what you want on your leaf
        return null;
    }
}

Ответ 7

До generics он был создан для API отражения, чтобы сохранить TYPE, возвращенный Method.getReturnType() для метода void, соответствующего другим классам примитивного типа.

EDIT: из JavaDoc of Void: "Класс Void является неинтересным классом-заполнителем для ссылки на объект класса, представляющий ключевое слово void Java". До Generics, я знаю, что не нужно, кроме размышлений.

Ответ 8

Void создает для обнуления его примитивный тип void. Каждый примитивный тип имеет соответствующий тип ссылки. Void используется для создания экземпляра универсального класса или использования общего метода. Общие аргументы, которые вас не интересуют, и вот пример...

public void onNewRegistration() {
    newRegistrationService.createNewUser(view.getUsername(), view.getPassword(),
            view.getInitialAmount(), view.getCurrency(), new AsyncCallback<Void>() {
      @Override
      public void onFailure(Throwable caught) {

      }

      @Override
      public void onSuccess(Void result) {
        eventBus.fireEvent(new NewRegistrationSuccessEvent());
      }
    });
  } 

здесь, как вы можете видеть, я не хочу ничего с сервера, который я прошу создать новые регистрации, но public interface AsyncCallback<T> { .... } - это общий интерфейс, поэтому я предоставляю Void, поскольку generics не принимают примитивные типы

Ответ 9

Поскольку вы не можете создать экземпляр Void, вы можете использовать Apache commons Null object, поэтому

Null aNullObject = ObjectUtils.Null;
Null noObjectHere = null;

в первой строке у вас есть объект, поэтому aNullObject != null выполняется, а во второй строке нет ссылки, поэтому noObjectHere == null содержит

Чтобы ответить на исходный вопрос постеру, для этого нужно различать "ничего" и "ничего", которые совершенно разные вещи.

PS: Скажите "нет" объекту "Null object"

Ответ 10

Он также обычно используется для обратных вызовов завершения Async-IO, когда у вас нет необходимости в объекте Attachment. В этом случае вы указываете значение null для операции ввода-вывода и реализуете CompletionHandler<Integer,Void>.

Ответ 11

Это может быть редкий случай, но однажды я использовал Void в классах аспектов.

Это был аспект, который запускается после методов с аннотацией @Log и регистрирует возвращаемый метод и некоторую информацию, если тип возвращаемого метода не является недействительным.

 @AfterReturning(value = "@annotation(log)", 
       returning = "returnValue", 
       argNames = "joinPoint, log, returnValue"
      )
    public void afterReturning(final JoinPoint joinPoint, final Log log,
            final Object returnValue) {

            Class<?> returnType = ((MethodSignature) joinPoint.getSignature())
            .getReturnType();
           if (Void.class.isAssignableFrom (returnType)) ) {
            //Do some log
         }
}