2017-10-09 3 views
0

je face à problème intéressantRxJava simple/Observable mise en œuvre de retour de l'interface

J'ai la méthode suivante

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

IResults est une interface et ConcreteResults est l'implémentation.

Cependant, je reçois une erreur

Error:(149, 27) error: incompatible types: Single<ConcreteResults> cannot be converted to Single<IResults> 

Comment résoudre ce problème? J'ai besoin d'une interface pour renvoyer le type de retour.

Cependant, cette astuce sale semble fonctionner :)

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

Répondre

1

Vous devez créer une variable avant de retourner la valeur. Le compilateur comprendra que IResult est le sur-type de ConcretResult. Si vous le renvoyez immédiatement, le compilateur ne l'obtient pas.

@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 { 

} 

Pour les paramètres, vous devez 1_7 utiliser:

compileOptions { 
    sourceCompatibility JavaVersion.VERSION_1_7 
    targetCompatibility JavaVersion.VERSION_1_7 
} 

Vous devez donner les pointeurs du compilateur, parce que le compilateur ne 1_7 inférence pas le type de définition.

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

    return just; 
} 
+0

ne fonctionne pas non plus, il me montre la même erreur. – bxfvgekd

+0

Quelle configuration du compilateur utilisez-vous? Avez-vous essayé Single .just (new result()); –

+0

J'utilise le compilateur par défaut fourni avec Android Studio. Cela ne marche pas aussi bien – bxfvgekd

1

Utilisation:

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

S'il vous plaît rappelez-vous que la génétique est hieritance avec un peu différent.

Bien que IResults soit un sous-type de ConcreteResults, Single of ConcreteResults n'est PAS un sous-type de Single de IResults. Vous devez utiliser un caractère générique pour créer une relation entre alors

Vous pouvez rechercher plus d'informations à ce sujet ici: https://docs.oracle.com/javase/tutorial/java/generics/subtyping.html