为什么返回超类示例会产生编译错误

bq8i3lrv  于 2021-07-08  发布在  Java
关注(0)|答案(1)|浏览(278)

嗨,下面的代码给出了编译错误,但我不明白为什么。

class SomeClass <T extends BaseClass> {
    T method(T x) {
        return x;                   // OK
    }

    T method() {
        return new BaseClass();    // compile error
    }
}

错误显示需要 T 但提供 BaseClass .
同样的这个:

class SomeClass {
    <T extends BaseClass> T method(T x) {
        return x;                          // OK
    }

    <T extends BaseClass> T method() {
        return new BaseClass();           // compile error
    }
}

我知道可以这样解决:

class SomeClass <T extends BaseClass> {
    T method(T x) {
        return x;                       // OK
    }

    @SuppressWarnings( "unchecked" )
    T method() {
        return (T) new BaseClass();    // OK
    }
}

但是我可以解释一下为什么这是不允许的吗?

rks48beu

rks48beu1#

这就是继承的原理。假设你有一个超类a,它有子类b和c。现在假设您的方法接受a类型的参数并返回b类型的对象。您的方法将接受c类型的对象作为参数,但是您无法返回它们,因为它们不是b类型,即使b和c都是a的子类。

相关问题