[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
. 객체 Void
는 void
제네릭 키워드와 유사합니다 .
답변
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() {}
}