Подтвердить что ты не робот

Почему класс оболочки Void существует в JDK?

Возможный дубликат:
Используется для ссылочного типа Java Void?

Каково реальное использование класса Void в реальных проблемах? В каком сценарии мы можем использовать этот класс?

4b9b3361

Ответ 1

Если у вас есть объект (например, ExecutorService), который требует предоставить объект Callable<T>, вы можете передать ему Callable<Void>, чтобы указать, что ваш Callable ничего не возвращает. Callable<T> должен быть параметризован для некоторого типа, поэтому Void предоставляется для указания отсутствия типа.

Ответ 2

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

- Класс Void в соответствии с javadoc существует из-за того, что некоторое время нам может понадобиться представить ключевое слово void как объект.

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

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

Ответ 4

API отображения java использует Void.TYPE для представления возвращаемого типа метода, возвращающего пустоту, как указывает Люк Вудворд. (Возвращение Void.class, как я думал ранее, вызывает неоднозначность методов, возвращающих объявление типа возврата java.lang.Void).

 void test(){...};

 Method handleForTest = ...;
 assert(handleForTest.getReturnType() == Void.TYPE);

Post java 1.5 Void может использоваться в общих классах, чтобы указать, что они не возвращают значение. Реализация по-прежнему должна возвращать значение null, но его можно игнорировать, поскольку это единственное допустимое значение для типа Void.

interface<T> Example{
      //Implementations may do something and return a result
      T doSomeThing();
}

class ExampleVoid implements Example<Void>{
      //does something without returning a result
      Void doSomething(){return null;}
}

Кроме того, java позволяет задавать более конкретный тип возвращаемого значения при перезаписи метода, это в основном то же самое, что и общий пример выше, просто чтобы показать, что он работает без генериков, если исходным типом возврата является Object. (он ограничен Object, так как Void следует тем же правилам, что и любой другой тип java, к сожалению, нет способа использовать для этого безымянный нулевой тип)

interface Example{
      //Implementations may do something and return a result
      Object doSomeThing();
}

class ExampleVoid implements Example{
      //does something without returning a result
      Void doSomething(){return null;}
}

Ответ 5

JLS#14.8. Expression Statements

В отличие от C и С++ язык программирования Java допускает использование только определенных форм выражений. Обратите внимание, что язык программирования Java не позволяет "cast to void" - void не является типом, поэтому традиционный трюк записи выражения, например:

(void)... ;  // incorrect!

не работает. С другой стороны, язык программирования Java позволяет использовать все наиболее полезные типы выражений в операторах выражений и не требует вызова метода, используемого в качестве оператора выражения для вызова метода void, поэтому такой трюк почти никогда не нужен. Если нужен трюк, вместо него может использоваться оператор присваивания (§15.26) или оператор объявления локальной переменной (§14.4).

JLS#15.8.2. Class Literals

Тип void.class(§8.4.5) - Class<Void>.

JLS#8.4.5. Method Return Type

Результат объявления метода объявляет тип значения, возвращаемого методом (тип возвращаемого значения), или использует ключевое слово void, чтобы указать, что метод не возвращает значение.

Java doc Void

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

Используется для цели отражения, когда вы хотите проверить тип возвращаемого метода

if (getClass().getMethod("someMethod").getReturnType() == Void.TYPE)

То же самое применимо к общим методам.

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

Ответ 6

Причины

Был введен тип Void, позволяющий выполнять обратные вызовы и интерфейсы с внешними системами (JNI, вызовы JavaScript из апплетов и т.д....) и существует со времен Java 1.1 для таких случаев, когда тип интерфейса не известен или не применяется другим интерфейсом (и, следовательно, там, где вы не можете использовать Void ключевое слово). Java была разработана - за исключением примитивов и нулевых ссылок - как язык "все является объектом", для подтверждения отсутствия ожидаемых типов понадобилась фиктивная оболочка/местозаполнитель.

Определение

Метод, определяемый методом возвращаемого типа в разделе JLS (§8.4.5), потребности должны формально объявить при возврате типа:

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

Как упоминалось в разделе JLS для Class Literals (§ 15.8.2):

Тип void.class (§8.4.5) Class<Void>

Общее использование

Его использование стало более заметным с введением генериков в Java 5, поскольку это позволило определить эти интерфейсы для использования generics и позволило бы проверить тип использования этих интерфейсов и обратных вызовов. Раньше разработчику иногда приходилось знать, что не было переданного объекта или нет объекта возврата, например, в случае привилегированного блока выполнения с использованием AccessController, очень часто используется в Applet для определения защищенных кодов кода:

  somemethod() {
     // ...normal code here...
     AccessController.doPrivileged(new PrivilegedAction<Void>() {
         public Void run() {
             // privileged code goes here, for example:
             System.loadLibrary("awt");
             return null; // nothing to return
         }
     });
     // ...normal code here...
 }

Обратите внимание на отличие от версии Java 1.4 этого же кода, где было непонятно (и безопасно для типа) что ничего не возвращается:

   somemethod() {
        // ...normal code here...
        AccessController.doPrivileged(new PrivilegedAction() {
            public Object run() {
                // privileged code goes here, for example:
                System.loadLibrary("awt");
                return null; // nothing to return
            }
        });
       // ...normal code here...
  }

Дальнейшее чтение и подобные вопросы