java - 在 Kotlin 中实现返回 Collection 的 Java 方法

标签 java kotlin

我将 Kotlin 与 Spring Security 结合使用。实现此方法时:

public interface UserDetails extends Serializable {
  Collection<? extends GrantedAuthority> getAuthorities();
  ...
}

我注意到 Intellij 生成了这段 Kotlin 代码:

override fun getAuthorities(): MutableCollection<out GrantedAuthority> { ... }

...这是有道理的,因为 java.util.Collection 是可变的。

但是,如果我将 MutableCollection 替换为 Collection(应该是 kotlin.collections.Collection IIRC),代码仍然可以正常编译.这让我感到困惑,因为 kotlin.collections.CollectionMutableCollection 继承的只读接口(interface)。我可以为声明返回可变集合的方法返回不可变集合是没有意义的。

所以我的问题是:

  1. 为什么在这里使用 kotlin.collections.Collection 不会导致错误?
  2. 等效于 java.util.Collection 的正确 Kotlin 返回类型是什么?

最佳答案

  1. Why does using kotlin.collections.Collection not cause an error here?

如果您不知道,Kotlin 中的可变和非可变集合接口(interface)都解析为 Java 中的一个接口(interface)。所以 Kotlin 的 CollectionMutableCollection都是java.util.Collection在 Java 中,Kotlin 的 ListMutableList都是java.util.List在 Java 中,等等。

另外,Kotlin 有它的术语 declaration-site variance . Kotlin Collection接口(interface)定义为 Collection<out E>这意味着该接口(interface)是 E 类型的生产者.因此,有:

val col: Collection<GrantedAuthority> = ...

几乎与:

val col: MutableCollection<out GrantedAuthority> = ...

我说几乎是因为,而 MutableCollection<out ...>阻止任何人添加任何元素,它不会阻止一个人完全改变集合。例如,您仍然可以调用 clear()关于 Collection 。


  1. What's the correct Kotlin return type that's equivalent to java.util.Collection?

Java 没有声明站点差异。它也不区分可变和非可变集合(至少在接口(interface)级别)。

这意味着,从技术上讲,最匹配以下 Java 类型:

Collection<? extends GrantedAuthority>

是以下 Kotlin 类型:

MutableCollection<out GrantedAuthority>

这两种类型都是可变集合类型,并且被定义为类型为 GrantedAuthority生产者 (通过 Java 中的 ? extends 和 Kotlin 中的 out)。这两种类型都不允许您向集合中添加任何内容。

但是,如果您的 getAuthorities()方法应该返回一个不可修改集合(例如 Java 中的 Collections.unmodifiableCollection(collection)),那么从 Java 到 Kotlin 的更合适的转换是使用:

kotlin.collections.Collection<GrantedAuthority>

关于java - 在 Kotlin 中实现返回 Collection 的 Java 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63128815/

相关文章:

java - 更改日期和时间格式 Android

java - 在 Java 构建路径上找不到父类(super class) "javax.servlet.http.HttpServlet"

java - 如何单击随机网页元素?

android - Dagger 2.25 java.lang.NoClassDefFoundError : dagger/shaded/auto/common/BasicAnnotationProcessor

collections - 没有索引时基于索引的列表项的不同函数调用

Java HashMap 在循环迭代中丢失值

java - 使用自定义值验证 map

android - 在 kotlin 中创建 LayerDrawable 时发生类转换异常

android - 使用通知导航到带有 navArgs 的 fragment

kotlin - 您如何在Kotlin中进行合格的父类(super class)构造函数调用?