[java] Java 제네릭 void / Void 유형

나는 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?



답변

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

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


답변

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

간단히 말해서 Void.


답변

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


답변

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

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

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


답변

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


답변

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() {}
}


답변