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

17

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

    
задан Community 11.11.2012 в 14:26
источник

6 ответов

14

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

    
ответ дан mrb 11.11.2012 в 14:33
источник
12

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

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

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

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

    
ответ дан Kumar Vivek Mitra 11.11.2012 в 14:33
источник
  • Практически не используется List <Void>. –  Amit Deshpande 11.11.2012 в 15:45
  • Но если вы хотите использовать непрактичное использование, List <Void> может использоваться как очень неэффективный счетчик :-) –  Stephen C 11.11.2012 в 16:12
  • Вы правы, хотя. Тип void (non) в Java не означает то же самое, что и void в C / C ++. Тип списка, в котором вам не нужен тип элемента, является List <?> ... not List <Void>. –  Stephen C 11.11.2012 в 16:19
  • Можно создать экземпляры класса Void с небольшим количеством рефлексивного хакера. –  Luke Woodward 11.11.2012 в 18:27
7

% класс co_de% используется в Java-отражении.
см. Метод # getReturnType     

ответ дан Ilya 11.11.2012 в 14:30
источник
3

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;}
}
    
ответ дан josefx 11.11.2012 в 14:35
источник
  • API отражения Java использует void.class как возвращаемый тип методов void, а не Void.class. В вашем первом примере утверждение не удастся. –  Luke Woodward 11.11.2012 в 18:25
  • @ LukeWoodward спасибо, я обновил свой ответ –  josefx 11.11.2012 в 19:24
2

JLS#14.8. Expression Statements

  

В отличие от C и 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;
        }
    };
    
ответ дан Amit Deshpande 11.11.2012 в 14:53
источник
2

Причины

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

Определение

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

  

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

Как упоминалось в разделе JLS для классных литералов ( §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...
  }

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

ответ дан haylem 11.11.2012 в 20:15
источник