나는 제네릭으로 약간의 손실이 있습니다. Java 컴파일러에서 제네릭 형식을 반환하지 않는 이유는 무엇입니까?
public interface SampleValue<T> {
T getValue();
}
public static class SampleBoolean implements SampleValue<Boolean> {
@Override
public Boolean getValue() {
return Boolean.TRUE;
}
}
public static final class SampleValueGenerator {
private SampleValueGenerator() {
// do not call
}
public static <T, R extends SampleValue<T>> R forType(Class<T> clazz) {
if(Boolean.class.equals(clazz)) {
return new SampleBoolean();
}
}
}
나는이 시도
, 인 IntelliJ (즉, 컴파일러가)R
및
SampleBoolean
합니다 (
return
라인) 호환되지 않는 유형은 내게 말한다 : 나는 다음과 같은 코드가 있습니다.
나는 제네릭이 아닌 (원시) 반환 형식을하려고하면
public static <T> SampleValue forType(Class<T> clazz) {
내가 어떤 오류가 발생하지 않는다; 합니다 (?
와일드 카드)
public static <T, R extends SampleValue<?>> R forType(Class<T> clazz) {
public static <T> SampleValue<T> forType(Class<T> clazz) {
위해 나는 Incompatible types, Found: SampleBoolean, Required: SampleValue<T>
를 얻을.
내 생각에 예를 들면 다음과 관련이 있습니다. 목록 (하지만 형제 자매)의 조상이 아닌 목록,하지만 위의 나무에 대한 나무를보고 실패.
누군가가 무슨 일이 일어나고 있는지, 그리고 긴 예제가 효과가없는 이유를 설명해 주실 수 있습니까?
업데이트 :주의 : 아이디어는 서로 다른 유형의 몇 경우/다른 지점을 가지고 있었으나 컴파일러가 불평을 시작했을 때 나는
'AnotherAsSampleBoolean 클래스를 선언하여 샘플 값을 {...}'로 구현 한 다음'AnotherSampleBoolean result = forType (Boolean.class)'를 호출하면 예제 코드를 만들 수 있습니다. 'R'는'AnotherSampleBoolean'으로 추정 될 것이고 런타임에는'SampleBoolean'을'AnotherSampleBoolean'으로'ClassCastException'를 던질 것입니다. 그래서 예를 들면 다음과 같이하면됩니다. 컴파일러 오류를 피하기 위해 검사되지 않은 캐스팅을 사용하면 ' SampleValue forType (클래스 )'선언이 가장 안정적입니다. –
Radiodef
의미의 종류를 만드는 @Radiodef하지만' SampleValue forType (클래스 )'도 실패 ... –
Christian
'공공 정적 SampleValue > forType (클래스 를 clazz) {'(와일드 카드, 제네릭이 아닌 반환 형식) works ... –
Christian