我有java类,我需要用kotlin重写它。但我不能在里面重写仿制药。
Java类:
public abstract class AbstractFlagFilterFactory<T extends FlagFilter> extends FilterFactory {
abstract Class<T> getFilterFlagType();
abstract void processFlag(org.jooq.SelectQuery<?> query, T flag);
}我的科特林班
abstract class AbstractFlagFilterFactory<out FlagFilter> : FilterFactory {
abstract fun getFilterFlagType(): Class<out ru.vtblife.realtyobject.domain.filters.FlagFilter>
abstract fun processSetFlag(
query: org.jooq.SelectQuery<...(1)>,
flag: Class<out ru.vtblife.realtyobject.domain.filters.FlagFilter>
)
}签署(1)我用我的意见标记了我的问题领域。但也许问题出在别的地方。
发布于 2022-08-22 01:58:54
Kotlin的<out FlagFilter>并不等同于<T extends FlagFilter>。在泛型声明站点上使用out可以使类型协变量。这被称为声明站点差异,这是一个甚至在Java中都不支持的特性。
这里您想要的特性是通用的上限。与Java的<T extends FlagFilter>等价的是<T: FlagFilter>。这使得FlagFilter成为T.
这令人困惑的原因是,Java重载了extends单词的方差和上界,其意义取决于上下文。如果您看到一个? extends或? super,它分别是协方差或逆方差。否则,extends为上界。Java文档也没有帮助避免使用“方差”这个词,而是将协方差称为“上界通配符”和反方差“下界通配符”。
在您的函数中,您应该在Kotlin中使用<*>作为<?>在Java中的等价物。
https://stackoverflow.com/questions/73439345
复制相似问题