메서드의 반환 유형이 Void이면 무엇을 반환합니까? (공허하지 않습니다!)


115

Java에서 Generics를 사용하기 때문에 Void반환 유형을 갖는 함수를 구현해야했습니다 .

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

그리고 컴파일러는 내가 뭔가를 반환하도록 요구합니다 . 지금은 그냥 돌아오고 null있지만 이것이 좋은 코딩 연습인지 궁금합니다 ...

나는 v ‌oid가 아니라 V ‌oid 에 대해 묻는다 . 클래스 , 하지 예약 된 키워드 .Voidvoid

나는 또한 시도했다 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
공허를 반환해야하는 것은 결국 그렇게 펑키하지 않습니다. 예를 들어 Callable <T>로 간단히 지정할 수 있습니다. 때로는 무언가를 반환 할 필요가 없지만 예를 들어 Runnable을 사용할 수 없습니다.
Bombe

내가 언급했듯이 Void는 합법적 인 용도로 사용됩니다. 그러나 그는 "이것은 제네릭을 사용했기 때문일뿐"이라고 말했다. 그것은 그가 Void를 사용해야하는 컬렉션에 뭔가를했던 것처럼 들리게합니다.
John Feminella

컬렉션을 사용하면 실제로 매우 이상 할 것입니다.
Bombe

Void.class와 void.class는 모두 Class <Void>이지만 같지 않습니다. Void는 종종 Map 값 (또는 Collections.newSetFromMap 사용)에서 일반 인수로 사용되며 AccessController.doPrivileged를 반환합니다.
Tom Hawtin-tackline

@Tom : 예 퍼스. 그래서 "(기술적으로는 Class <Void>로 돌아올 것입니다.)"태그를 붙인 이유입니다. 그 부분을 수정해야합니까, 아니면 그대로 정확하다고 생각하십니까?
John Feminella

26

Void를 인스턴스화하는 방법이 없으므로 반환 할 있는 유일한 것은 null입니다.


13
더 정확하게는 악한 일을하지 않고는 Void를 인스턴스화 할 수있는 방법이 없습니다.
Michael Myers


20

귀하가 제공 한 다른 제안이 작동하지 않는 이유를 명확히하려면 :

Void.classVoid.TYPE같은 객체를 가리키고 타입 인 Class<Void>의하지 Void.

그렇기 때문에 해당 값을 반환 할 수 없습니다. new Void()유형 Void이지만 해당 생성자는 존재하지 않습니다. 사실, Void공용 생성자가 없으므로 인스턴스화 할 수 없습니다 . Void다형성을 제외하고 유형의 객체를 가질 수 없습니다 null.

도움이 되었기를 바랍니다! :-)


1
사소한 수정 :을 Void.TYPE가리 키지 않습니다 Void.class. 를 가리 킵니다 void.class.
shmosel

1

모호한 이유로이 유형을 사용해야한다면 반환 값이 어쨌든 사용되지 않을 것이라고 가정하기 때문에 실제로 null을 반환하는 것이 현명한 옵션 인 것 같습니다.
컴파일러는 어쨌든 무언가를 반환하도록 강제합니다.
그리고이 클래스에는 공개 생성자가없는 것 같으므로 new Void ()는 불가능합니다.


나는 필수가 될 수 없습니다. 그것은 단지 관습입니다.
Tom Hawtin-tackline

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.