Что мне возвращать, если возвращаемый тип метода - Void? (Не недействительно!)

115

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

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

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

Я спрашиваю о V OID, а не v подъязычная. Класс Void, а не зарезервированное ключевое слово void.

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

  • Итак, что я должен вернуть, если тип возврата функции Void?
  • Какое общее использование Voidкласса?
Даниэль Риковски
источник

Ответы:

104

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

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

Какой в ​​этом смысл Void?

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

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

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

Джон Феминелла
источник
13
В конце концов, возвращение Void не так уж и весело. Это может быть просто поручено, например, Callable <T>. Иногда вам просто не нужно что-то возвращать, но вы не можете использовать, например, Runnable.
Bombe
Как я уже отмечал, Void имеет законное использование. Но он сказал, что «это произошло только из-за использования дженериков». Это звучит так, будто он что-то сделал с коллекцией, в которой необходимо использовать Void, что, я бы сказал, является довольно исключительным случаем.
Джон Феминелла,
С коллекциями это действительно было бы очень странно.
Bombe
И Void.class, и void.class являются Class <Void>, но не равны. Void часто используется как общий аргумент в значении Map (или используйте Collections.newSetFromMap) и возвращении AccessController.doPrivileged.
Том Хотин - tackline
@Tom: Йепперс. Вот почему я пометил "(Технически, вы вернетесь Class <Void>.)" Следует ли мне изменить эту часть или вы думаете, что она точна как есть?
Джон Феминелла,
26

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

Джон Брайт
источник
13
Точнее, невозможно создать экземпляр Пустоты, не совершая зла.
Майкл Майерс
20

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

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

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

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

Мартейн
источник
1
Незначительное исправление: Void.TYPEне указывает Void.class. Это указывает на void.class.
shmosel
1

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

PhiLho
источник
Я НЕ ДОЛЖЕН; это просто условность.
Том Хотин - tackline
-2

именно так.

public Class TestClass {
    public void testMethod () {
        return;
    }
}
Чан-Хо Бэ
источник
2
ОП сказал Void, что нет void. Другие ответы, похоже, уже довольно хорошо освещают эту тему.
E_net4 берет перерыв