gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 12:32:29 24 4
gpt4 key购买 nike

我将 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com