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


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

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

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

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

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

EDIT: просто чтобы избавить вас от downvotes: я спрашиваю о Vидентификатор объекта, а не void. Класс Void,не зарезервированное ключевое слово void.

5 111

5 ответов:

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

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

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

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

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

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

нет никакого способа создать экземпляр пустоты, так что единственное, что вы can return имеет значение null.

return null - Это путь.

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

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

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

Надежда это помогает! : -)

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