2017-10-09 25 views
0

的可觀回報的實現我還面臨着有趣的問題RxJava單/接口

我有以下方法

@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的超類型。如果你立即返回它,編譯器不會得到它。

@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設置必須使用:

compileOptions { 
    sourceCompatibility JavaVersion.VERSION_1_7 
    targetCompatibility JavaVersion.VERSION_1_7 
} 

你必須給編譯器的指針,因爲在1_7編譯器不推理自定義類型。

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

    return just; 
} 
+0

也不管用,它讓我看到了同樣的錯誤。 – bxfvgekd

+0

你正在使用哪種編譯器設置?你試過單號 .just(新的Result()); –

+0

我正在使用與Android Studio捆綁在一起的默認編譯器。這不起作用 – bxfvgekd

1

用途:

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

請記住遺傳學說hieritance是一個有點不同。

雖然IResults是ConcreteResults的子類型,但單個ConcreteResults不是單個IResults的子類型。您需要使用通配符來創建然後

之間的關係,你可以在這裏尋找更多關於它的信息:https://docs.oracle.com/javase/tutorial/java/generics/subtyping.html