2017-10-09 9 views
0

의 관찰 가능한 리턴 구현 나는 다음과 같은 방법을는 인터페이스는 RxJava 싱글/I 흥미로운 문제</p> <p>에 직면 한 인터페이스

@Override 
public Single<IResults> getResults() { 
    return Single.just(new ConcreteResults()); 
} 

IResults 및 ConcreteResults는 구현이있다.

그러나 나는 오류이 문제를 해결하는 방법
Error:(149, 27) error: incompatible types: Single<ConcreteResults> cannot be converted to Single<IResults> 

는 무엇입니까? 추상 반환 유형에 대한 인터페이스가 필요합니다.

그러나,이 더러운 트릭 일 :

Single.just(new ConcreteResults()) 
       .map(new Function<ConcreteResults, IResults>() { 
        @Override 
        public IResults apply(@NonNull ConcreteResults results) throws Exception { 
         return results; 
        } 
       }); 

답변

1

당신은 값을 반환하기 전에 변수를 만들 필요가 보인다. 컴파일러는 IResult가 ConcretResult의 over-type이라는 것을 알 수 있습니다. 당신이 그것을 즉시 반환한다면 컴파일러는 그것을 얻지 못한다.

@Test 
void name() { 
    Single<IResult> result = getResult(); 
} 

private Single<IResult> getResult() { 
    Single<IResult> just = Single.just(new Result()); 

    return just; 
} 

interface IResult { 

} 

class Result implements IResult { 

} 

1_7 설정을 위해 당신은 사용해야합니다 : 1_7에서 컴파일러가 정의에서 유형을 추론하지 않기 때문에

compileOptions { 
    sourceCompatibility JavaVersion.VERSION_1_7 
    targetCompatibility JavaVersion.VERSION_1_7 
} 

당신은, 컴파일러 포인터를 제공해야합니다.

private Single<IResult> getResult() { 
    Single<IResult> just = Single.<IResult>just(new Result()); 

    return just; 
} 
+0

https://docs.oracle.com/javase/tutorial/java/generics/subtyping.html 중 하나가 작동하지 않습니다, 그것은 나에게 같은 오류를 보여줍니다. – bxfvgekd

+0

어떤 컴파일러 설정을 사용하고 있습니까? 싱글 을 시도 했습니까? (새로운 결과()); –

+0

Android Studio와 함께 제공되는 기본 컴파일러를 사용하고 있습니다. 이것도 잘 작동하지 않습니다 – bxfvgekd

1

사용 :

@Override public Single<? extends IResults> getResults() { 
    return Single.just(new ConcreteResults()); 
} 

유전학과 그 hieritance을 기억하십시오 조금 다르다.

IResults는 ConcreteResults의 하위 유형이지만 ConcreteResults의 Single은 IResults Single의 하위 유형이 아닙니다. 당신은 여기에 대한 자세한 정보를 검색 할 수 다음

사이의 관계 생성하기 위해 와일드 카드를 사용해야합니다 :