接口

时间:2017-10-09 06:27:45

标签: java generics rx-java rx-android rx-java2

我遇到了有趣的问题

我有以下方法

@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;
                    }
                });

2 个答案:

答案 0 :(得分:2)

使用:

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

请记住遗传学的遗传有点不同。

虽然IResults是ConcreteResults的子类型,但ConcreteResults的Single不是Single IResults的子类型。您需要使用通配符在

之间创建关系

您可以在此处搜索有关它的更多信息:https://docs.oracle.com/javase/tutorial/java/generics/subtyping.html

答案 1 :(得分: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;
}