我尝试在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集合可变?
1条答案
按热度按时间zi8p0yeb1#
将
@JvmWildcard
应用于Collection
的类型参数:然后,实现可以返回
java.util.Collection<? extends ItemInterface>
(或缩小到List
,如您所见):