gpt4 book ai didi

kotlin - 防止 Kotlin 强制 Java 查看通配符类型

转载 作者:IT老高 更新时间:2023-10-28 13:47:34 26 4
gpt4 key购买 nike

这很好用:

class Wrapped<out T>(val value: T)

open class Wrapper<T> {
fun wrap(map: T): Wrapped<T> = Wrapped(map)
}

class Wrapper2 : Wrapper<Map<String, String>>()

val wrapped: Wrapped<Map<String, String>> = Wrapper2().wrap(mapOf())

但是,当我尝试从 Java 访问 Wrapper2.wrap 时, map 返回通配符类型:

    Map<String, String> toWrap = new HashMap<>();
Wrapped<Map<String, String>> result;
result = new Wrapper<Map<String, String>>().wrap(toWrap); // ok
result = new Wrapper2().wrap(toWrap); // NOT ok, returns Wrapped<Map<String, ? extends String>>

我可以通过使用显式类型覆盖 Wrapper2 中的 wrap 来解决此问题。

为什么 Wrapper2.wrap 返回的类型与 Wrapper.wrap 不同?

最佳答案

您可以在泛型中使用通配符来抑制 Kotlin,如 described in the Kotlin reference它描述了 @JvmSuppressWildcards 注释(或该 @JvmWildcard 注释的反面)。

来自文档:

On the other hand, if we don't need wildcards where they are generated, we can use @JvmSuppressWildcards:

fun unboxBase(box: Box<@JvmSuppressWildcards Base>): Base = box.value
// is translated to
// Base unboxBase(Box<Base> box) { ... }

NOTE: @JvmSuppressWildcards can be used not only on individual type arguments, but on entire declarations, such as functions or classes, causing all wildcards inside them to be suppressed.

关于kotlin - 防止 Kotlin 强制 Java 查看通配符类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44209856/

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