Что я возвращаю, если возвращаемым типом метода является Void? (Не пусто!) - PullRequest
111 голосов
/ 24 марта 2009

Из-за использования Generics в Java мне пришлось реализовать функцию, имеющую Void в качестве возвращаемого типа:

public Void doSomething() {
    //...
}

и компилятор требует, чтобы я вернул что-то . Сейчас я просто возвращаю null, но мне интересно, это хорошая практика кодирования ...

Я спрашиваю о V ‌oid, а не v ‌oid. Класс Void, не зарезервированное ключевое слово void.

Я также пытался Void.class, void, Void.TYPE, new Void(), возврата нет вообще, но все это не работает вообще (По более или менее очевидным причинам) (подробности см. в этом ответе )

  • Так что я должен возвращать, если тип возвращаемого значения функции Void?
  • Как обычно используется класс Void?

Ответы [ 6 ]

102 голосов
/ 24 марта 2009

Так что я должен возвращать, если тип возвращаемой функции должен быть Void?

Используйте return null. Void не может быть создан и является просто заполнителем для типа Class<T> void.

Какой смысл Void?

Как отмечалось выше, это заполнитель. Void - это то, что вы получите, если, например, используете отражение, чтобы посмотреть на метод с типом возврата void. (Технически, вы получите обратно Class<Void>.) У него есть другие варианты использования в этом направлении, например, если вы хотите параметризовать Callable<T>.

Из-за использования обобщений в Java мне пришлось реализовать эту функцию

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

24 голосов
/ 24 марта 2009

Невозможно создать экземпляр Void, поэтому единственное, что вы можете вернуть - это ноль.

19 голосов
/ 19 мая 2009

Чтобы понять, почему другие ваши предложения не работают:

Void.class и Void.TYPE указывают на один и тот же объект и имеют тип Class<Void>, а не Void.

Вот почему вы не можете вернуть эти значения. new Void() будет иметь тип Void, но этот конструктор не существует. Фактически, Void не имеет открытых конструкторов и поэтому не может быть создан: у вас никогда не может быть объекта типа Void, за исключением полиморфного null.

Надеюсь, это поможет! : -)

19 голосов
/ 24 марта 2009

return null это путь.

0 голосов
/ 07 марта 2019

просто так.

public Class TestClass {
    public void testMethod () {
        return;
    }
}
0 голосов
/ 24 марта 2009

Если по непонятным причинам вы ДОЛЖНЫ использовать этот тип, тогда действительно возвращение нулевого значения представляется разумным вариантом, поскольку я предполагаю, что возвращаемое значение не будет использоваться в любом случае.
Компилятор все равно заставит вас что-то вернуть.
И у этого класса, похоже, нет открытого конструктора, поэтому новый Void () невозможен.

...