我将 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.Collection
是 MutableCollection
继承的只读接口(interface)。我可以为声明返回可变集合的方法返回不可变集合是没有意义的。
所以我的问题是:
- 为什么在这里使用
kotlin.collections.Collection
不会导致错误? - 等效于
java.util.Collection
的正确 Kotlin 返回类型是什么?
最佳答案
- Why does using
kotlin.collections.Collection
not cause an error here?
如果您不知道,Kotlin 中的可变和非可变集合接口(interface)都解析为 Java 中的一个接口(interface)。所以 Kotlin 的 Collection
和 MutableCollection
都是java.util.Collection
在 Java 中,Kotlin 的 List
和 MutableList
都是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 。
- 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/