Какова цель 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
.