Вопрос

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

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

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

Это было полезно?

Решение

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

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

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

Другие советы

Вы можете создать экземпляр 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 java.lang.Void@75636731

Future<Void> работает как очарование :)

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

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

  

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

Все классы-оболочки примитивов (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, гораздо понятнее, что вы делаете что-то с типом <=>.

Кроме того, в последний раз, когда я пытался это сделать, BeanShell не распознал <=>, поэтому Вы должны использовать <=> там.

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

Пример

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

   OUT visit(Leaf2 leaf);
}

Когда вы реализуете своего посетителя, вы можете явно установить для OUT значение Void, чтобы вы знали, что ваш посетитель всегда будет возвращать ноль вместо использования 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;
    }
}

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

РЕДАКТИРОВАТЬ: Из JavaDoc of Void: " Класс Void является нереализуемым классом-заполнителем для хранения ссылки на объект Class, представляющий ключевое слово Java void " ;. До Generics я не знаю ничего, кроме размышлений.

Поскольку вы не можете создать экземпляр Void, вы можете использовать Apache Commons Пустой объект , поэтому

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

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

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

PS: скажите «нет» шаблону пустых объектов

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, поскольку универсальные шаблоны не принимают примитивные типы

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

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

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

 @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
         }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top