Какова цель List <Void>?

Я даже не знал, что это выполнимо, но я видел, когда просматривал некоторый код в Интернете методом с такой подписью:

public List<Void> read( ... )

... Что? Есть ли причина для этого? Что может сделать этот List? Насколько мне известно, невозможно создать экземпляр объекта Void.

Ответ 1

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

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

Если в SwingWorker был метод List<V> returnAllIntermediateResults() с Void в качестве параметра типа V, он создал бы метод, аналогичный тому, который вы опубликовали в своем вопросе.

Код будет абсолютно корректным. Вы можете создать любую реализацию интерфейса List (например, ArrayList) с параметром типа Void. Но единственным значением типа Void может быть null. Таким образом, список не может содержать ничего, кроме null s, если реализация позволяет использовать элементы null.

Ответ 2

Один случай, когда это может быть полезно, - это если вы хотите вернуть коллекцию возвращаемых значений из функции. Скажем,

static List<T> forEach(Func<A,T> func, List<A> items) {
   List<T> ret = new List<T>();
   for(int i = 0; i< items.length; i++) {
     ret.add(func.call(items[i]);
   }
   return ret;
}

public static void main() {
  ...
  List<Void> boringResult = 
   forEach(
    new Func<Void, Integer> {@override Void call(Integer i) {...}});
}

Не так полезно, но вы можете увидеть случай, когда это было необходимо.

Ответ 3

List<Void> странно. Он может иметь только элементы null, так как вы не можете создать объект типа Void. Я не думаю, что это практическое применение.

Void является частью java.lang. Это не специальное ключевое слово или что-то еще. Это "псевдо-тип" (согласно документам), используемый как держатель места для представления объекта Class, соответствующего Void, как в Class<Void>. Из документов для Class:

Примитивные типы Java (boolean, byte, char, short, int, long, float и double), а ключевое слово Void также представленный как Class объектов.

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

Class<Void> voidType = void.class; // == Void.TYPE

так же, как вы можете написать:

Class<Integer> intType = int.class; // == Integer.TYPE

Ответ 4

Я согласен, это странно.

Я могу увидеть его использование, если вы хотите расширить общий класс и вернуть void из метода. Я столкнулся с тем, что хочу использовать int и должен был использовать Integer, потому что дженерикам java не нравятся примитивные типы.

public interface ObjectUserPool<E, T> {
    public E useObject(T o);
}

public class NonReturningObjectUserPool extends ObjectUserPool<Void, Integer> {
    public Void useObject(Integer i);
}

Я думаю, что это то, что говорит java API, хотя, честно говоря, я не могу найти применение для NonReturningObjectUserPool.