用Java实现Kotlin接口出错:不兼容返回类型

9rygscc1  于 2023-05-21  发布在  Java
关注(0)|答案(1)|浏览(131)

我尝试在Java中实现Kotlin接口,所以我的接口看起来像这样:

interface KInterface {
    val items: Collection<ItemInterface>
}

interface ItemInterface {
//
}

然后,在我的Java代码中,我有以下类:

class JavaItemImpl implemets ItemInterface {
//
}

class JavaImpl implements KInterface {
    private List<JavaItemImpl> items;
    
    @Override
    public List<? extends ItemInterface> getItems() {
        return items;
    }
}

KotlinCollection是协变的public interface Collection<out E> : Iterable<E>,所以我假设List<? extends ItemInterface>在实现Kotlin接口时可以工作。然而,这段代码给了我一个错误:'getItems()' in 'JavaImpl' clashes with 'getItems()' in 'KInterface'; attempting to use incompatible return type
一种解决方法是在KInterface中创建items可变集合,并添加一个类型投影,如下所示:

val items: MutableCollection<out ItemInterface>

但我想知道,有没有其他方法可以实现这样的Kotlin接口,而不使Kotlin集合可变?

zi8p0yeb

zi8p0yeb1#

@JvmWildcard应用于Collection的类型参数:

interface KInterface {
    val items: Collection<@JvmWildcard ItemInterface>
}

然后,实现可以返回java.util.Collection<? extends ItemInterface>(或缩小到List,如您所见):

@Override @NotNull public Collection<? extends ItemInterface> getItems() {
    return items;
}

相关问题