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

Java generics void/Void types

Я реализую ResponseHandler для пакета apache HttpClient, например:

new ResponseHandler<int>() {
    public int handleResponse(...) {
        // ... code ...
        return 0;
    }
}

но я бы хотел, чтобы функция handleResponse ничего не возвращала, т.е. void. Это возможно? Следующее не компилируется, поскольку void не является допустимым типом Java:

new ResponseHandler<void>() {
        public void handleResponse(...) {
            // ... code ...
        }
}

Я полагаю, что я мог бы заменить void на void, чтобы вернуть объект void, но это не совсем то, что я хочу. Вопрос: возможно ли организовать эту ситуацию обратного вызова таким образом, чтобы я мог возвратить void из handleResponse?

4b9b3361

Ответ 1

Generics обрабатывает только классы объектов. void и примитивные типы не поддерживаются Generics, и вы не можете использовать их как параметризованный тип. Вместо этого вы должны использовать Void.

Можете ли вы сказать, почему вы не хотите использовать Void?

Ответ 2

Для этой точной ситуации был создан тип Void: создать метод с типичным типом возврата, где подтип может быть "недействительным". Void был сконструирован таким образом, что объекты такого типа не могут быть созданы. Таким образом, метод типа Void всегда будет возвращать null (или полностью ненормально), что почти так же близко, как вы собираетесь получить. Вам нужно положить return null в метод, но это должно быть лишь незначительное неудобство.

Вкратце: используйте Void.

Ответ 3

Когда вам нужно вернуть java.lang.Void, просто верните null.

Ответ 4

Вы не можете иметь примитивы в дженериках, чтобы int был на самом деле integer. Объект Void аналогичен ключевому слову Void для дженериков.

Ответ 5

Увы, это невозможно. Вы можете установить код для возврата Void, как вы говорите, однако вы никогда не сможете создать Void, чтобы вы фактически не могли написать функцию, которая соответствует эта спецификация.

Подумайте об этом как: Общая функция говорит, что "эта функция возвращает что-то типа X", и вы можете указать X, но вы не можете изменить предложение на "эта функция ничего не возвращает". (Я не уверен, согласен ли я с этой семантикой, но так, как они есть.)

В этом случае то, что я всегда делаю, просто возвращает функцию return type Object и на самом деле всегда возвращает null.

Ответ 6

Эта реализация java.lang.Void в Java говорит сама за себя. Кроме того, я написал статью, которая связывает это с дженериками. Прежде чем я начал понимать это, подумал немного: http://www.siteconsortium.com/h/D00006.php. Уведомление TYPE = Class.getPrimitiveClass( "void" );

пакет java.lang;

public final class Void {

    public static final Class<Void> TYPE = Class.getPrimitiveClass("void");

    private Void() {}
}