Обобщения Java void / Void типы - PullRequest
62 голосов
/ 06 апреля 2011

Я реализую 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?

Ответы [ 6 ]

76 голосов
/ 06 апреля 2011

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

Короче: используйте Void.

49 голосов
/ 06 апреля 2011

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

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

4 голосов
/ 04 января 2017

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

1 голос
/ 06 апреля 2011

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

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

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

1 голос
/ 06 апреля 2011

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

0 голосов
/ 27 декабря 2013

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

пакет java.lang;

public final class Void {

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

    private Void() {}
}
...