возвращение объекта Void - PullRequest
92 голосов
/ 09 марта 2010

Как правильно вернуть тип Void, если он не примитив? Например. В настоящее время я использую ноль, как показано ниже.

interface B<E>{ E method(); }

class A implements B<Void>{

    public Void method(){
        // do something
        return null;
    }
}

Ответы [ 4 ]

117 голосов
/ 09 марта 2010

Класс Void - это нереализуемый класс-заполнитель для хранения ссылки на объект Class, представляющий ключевое слово Java void.

Так что достаточно одного из следующих:

  • параметризация с помощью Object и возврат new Object() или null
  • параметризация с помощью Void и возврат null
  • параметризация с NullObject вашей

Вы не можете сделать этот метод void, а что-то еще возвращает что-то . Поскольку это что-то игнорируется, вы можете вернуть все что угодно.

9 голосов
/ 14 января 2016

Java 8 представила новый класс Optional<T>, который можно использовать в таких случаях. Чтобы использовать его, вы должны немного изменить свой код следующим образом:

interface B<E>{ Optional<E> method(); }

class A implements B<Void>{

    public Optional<Void> method(){
        // do something
        return Optional.empty();
    }
}

Это позволяет вам гарантировать, что вы всегда получаете ненулевое возвращаемое значение из вашего метода, даже когда ничего не нужно возвращать. Это особенно эффективно при использовании в сочетании с инструментами, которые определяют, когда null можно или нельзя вернуть, например, затмение @NonNull и @Nullable аннотации.

3 голосов
/ 09 марта 2010

Если вам просто не нужно ничего как ваш тип, вы можете использовать void. Это может быть использовано для реализации функций или действий. Затем вы можете сделать что-то вроде этого:

interface Action<T> {
    public T execute();
}

abstract class VoidAction implements Action<Void> {
    public Void execute() {
        executeInternal();
        return null;
    }

    abstract void executeInternal();
}

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

Затем вы можете использовать эти действия, как это:

Учитывая метод

private static <T> T executeAction(Action<T> action) {
    return action.execute();
}

Вы можете назвать это как

String result = executeAction(new Action<String>() {
    @Override
    public String execute() {
        //code here
        return "Return me!";
    }
});

или, для действия void (обратите внимание, что вы никому не назначаете результат)

executeAction(new VoidAction() {
    @Override
    public void executeInternal() {
        //code here
    }
});
0 голосов
/ 09 марта 2010

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

Я считаю, что условием является использование Object при наследовании в качестве параметра типа

ИЛИ

Распространите параметр типа вверх, а затем разрешите пользователям вашего класса создавать экземпляры, используя Object и назначая объект переменной, типизированной с помощью подстановочного знака типа ?:

interface B<E>{ E method(); }

class A<T> implements B<T>{

    public T method(){
        // do something
        return null;
    }
}

A<?> a = new A<Object>();
...