对应于扩展 super 内部类的内部类的方法的参数类型



我有一些构成如下的类:

class A {
    inner class B {}
    void func(B param) {}
}
class Asub extends A {
    inner class B extends A.B {}
    @Override
    void func(B param) {}      // problematic line
}

但是,编译器不允许它作为适当的覆盖,只有在我更改(在Asub中(

时才允许它

void func(B param)

to

void func(A.B param)

但是,我不想这样做,因为我在Asub.B中定义了一些过度功能,但如果我将param类型更改为A.B而不是B,则Linter告诉我Asub.B未使用

我将感谢您解决此问题的任何帮助,或者如果不可能,则可能是完成我想要的功能

的替代方法

这个问题的实际上下文与Android RecyclerView.Adapter S和ViewHolder S有关,但我认为问题不在那里

这与内部类无关,问题在于,您不能用f(b扩展a(覆盖函数f(a(,因为所有覆盖方法都必须能够接受超级方法允许的所有参数。

当然,您可以始终以覆盖方法施放为子类型。

这个问题到底是什么语言?extendsvoid@Override是Java,而inner class是Kotlin。


除此之外,覆盖函数然后限制它可以将其作为参数限制是没有意义的。当有人这样做时,您期望会发生什么?

A asub = new Asub();
asub.func(new A.B());

如果您得到了想要的东西,此功能调用将不再有效 - 这打破了Liskov替代原则,该原则基本上规定了" 期望不再提供,请提供同样的提供"。值得庆幸的是,Java或Kotlin都不会允许。

我相信您在这里最好的照片是使用仿制药。

的线
abstract class A<T extends A.B> {
    class B {
      // ...
    }
    abstract void func(T param) {
      //..
    }
}
class Asub<Asub.B> extends A {
    class B extends A.B {
      // ...
    }

    @Override
    void func(Asub.B param) {
      // ...
    }
}

可能应该完成这项工作。

最新更新