2017-10-09 9 views
0

の観察可能なリターンの実装は、インタフェースとConcreteResultsが実装されています。RxJavaシングル/私は興味深い問題で</p> <p>に直面しているインタフェース

しかし、私はこの問題を解決するためにどのようにエラーに

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設定のためには、使用する必要があります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

はどちらか動作しません、それは私に同じエラーが表示されます。 – 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のサブタイプではありません。あなたは、あなたがここにそれについての詳細な情報を検索することができます

、その後の関係を作成するために、ワイルドカードを使用する必要があります。 https://docs.oracle.com/javase/tutorial/java/generics/subtyping.html

関連する問題