Java 제네릭 void / Void 유형


79

나는 ResponseHandler다음과 같이 apache HttpClient 패키지를 구현하고 있습니다 .

new ResponseHandler<int>() {
    public int handleResponse(...) {
        // ... code ...
        return 0;
    }
}

하지만 handleResponse함수가 아무것도 반환하지 않기를 바랍니다 void. 이것이 가능한가? 다음은 void유효한 Java 유형 이 아니므로 컴파일되지 않습니다 .

new ResponseHandler<void>() {
        public void handleResponse(...) {
            // ... code ...
        }
}

나는 대체 할 수있는 가정 void으로 Void반환 할 Void객체를,하지만 내가 원하는 것을 정말 아니다. 질문 : 그것은 가능하다 내가 반환 할 수 이러한 방법이 콜백 상황을 정리하기 void로를 handleResponse?

답변:


65

Generics는 객체 클래스 만 처리합니다. void 및 primitive 유형은 Generics에서 지원하지 않으며 매개 변수화 된 유형으로 사용할 수 없습니다. 대신 Void를 사용해야합니다.

왜 사용하고 싶지 않은지 말할 수 있습니까 Void?


8
나는 return대부분 청결을 위해 아무것도 반환하지 않는 함수에 명령문 을 포함하지 않는 것을 선호합니다 .
Travis Webb 2011

8
void메서드 를 호출 null하고이 추악함을 숨기기 위해 반환 하는 추상 래퍼를 만들 수 있습니다 .
Peter Lawrey 2011

47
"간접 레이어를 추가하면 컴퓨터 과학의 모든 문제를 해결할 수 있음"을 상기시켜 주신 +1
Travis Webb 2011

사용자의 특정 요구에 @TravisWebb 찾고, 단지 모두에서 제네릭 및 반환 사용하지 않는 Object작동 있을지 유형을
Chaitanya

87

Void유형이 정확한 상황을 만들었습니다 : 하위 유형이 "무효"가 될 수있는 일반적인 반환 형식과 방법을 만들 수 있습니다. Void해당 유형의 개체를 만들 수 없도록 설계되었습니다. 따라서 유형의 메서드 Void는 항상 반환 null(또는 비정상적으로 완료)되며, 이는 얻을 수있는 것과 거의 비슷합니다. return null메서드 를 입력 해야하지만 이는 사소한 불편 일뿐입니다.

간단히 말해서 Void.


Arrgh-문제가되는 제네릭의 고통은 "Void"의 반환 유형을 정의 할 경우 "return (null);"에 넣어야합니다. void의 반환 유형을 선언하는 주된 이유는 return 문을 가질 필요가없고 기존 "void"메소드를 사용할 수 있기 때문입니다. Java Generics의 문제 중 일부는 런타임 유형 검사의 융합입니다. 컴파일 타임 코드 생성 및 "부 키핑"지원이 필요합니다. 언어 측면 에서 코드를 작성하는 데 편리함을 제공하는 "매크로"와 "템플릿"이 필요합니다 .
peterk 2013

6
+1 명확히하기 위해 Void는 JDK1.1 이후로 존재했습니다. 원래 Reflection과 함께 사용하기 위해 만들어졌지만 제네릭에서 비슷한 역할을합니다.
John McCarthy

@ILMTitan Void를 반환하도록 정의 된 메서드의 "return null"문에 대한 문서에 대한 참조를 제공 할 수 있습니까?
Andriy Simonov 2016

@ andriy-simonov 반환 유형이 인 메서드 void는 값을 반환 할 필요가 없습니다. 반환 유형 Object또는 하위 클래스를 가진 메서드 Void는 값을 반환해야합니다 (또는 정상적으로 완료되지 않음). 에 할당 할 수 있고 메서드 Void에서 반환 할 수있는 유일한 값 Voidnull입니다.
ILMTitan

8

반환해야 할 때는 java.lang.Void반환하십시오 null.


1

아아 그것은 불가능합니다. Void말한대로 반환하도록 코드를 설정할 수 있지만 a를 인스턴스화 Void할 수 없으므로 실제로이 사양을 준수하는 함수를 작성할 수 없습니다.

다음과 같이 생각해보십시오. 일반 함수는 "이 함수는 X 유형의 무언가를 반환합니다"라고 말하고 X를 지정할 수 있지만 문장을 "이 함수는 아무것도 반환하지 않음"으로 변경할 수 없습니다. (이 의미론에 동의하는지 확실하지 않지만 그 방식입니다.)

이 경우, 제가 항상하는 일은 함수를 return type Object으로 만들고 실제로는 항상 return null입니다.


1
반환 유형이 Object 인 경우 컴파일러는 null 만 반환된다는 것을 보장 할 수 없습니다. Thomas '답변을 확장하여 다음을 시도해보십시오. static Void v() { return null; } static Void n() { return "NotAllowed"; } static Object o() { return "Allowed"; }
Nathan Niesen

1

제네릭에는 기본 형식을 사용할 수 없으므로 int실제로 Integer. 객체 Voidvoid제네릭 키워드와 유사합니다 .


4
void기본이 아니라 자바 키워드 일뿐입니다. "유형"이 없습니다
Travis Webb

그리고 그것은 확실히 동의어가 아닙니다! void(소문자)-키워드, 아무 것도 반환되지 않습니다. Void(대문자)-( 인스턴스화 할 수없는 ) 클래스 , 반환되는 해당 클래스의 인스턴스 (인스턴스화 할 수없는 null이후 에만 가능 )
user85421

@Carlos Heuberger는 당신을 위해 더 나은 유사합니까?
mark-cs 2011

0

Java의이 java.lang.Void 구현은 그 자체로 말합니다. 또한 이것을 제네릭과 연결하는 기사를 썼습니다. http://www.siteconsortium.com/h/D00006.php를 이해하기 전에 약간의 생각이 필요했습니다 . 주의 TYPE = Class.getPrimitiveClass ( "void");

패키지 java.lang;

public final class Void {

    public static final Class<Void> TYPE = Class.getPrimitiveClass("void");

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