我有一些构成如下的类:
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(,因为所有覆盖方法都必须能够接受超级方法允许的所有参数。
当然,您可以始终以覆盖方法施放为子类型。
这个问题到底是什么语言?extends
,void
和@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) {
// ...
}
}
可能应该完成这项工作。