Kotlin 类型方差和星形投影

问题描述 投票:0回答:2

我已经阅读了关于类型投影和星形投影的书(Kotlin in Action,MEAP)、文档和文章,但投影似乎仍然写得很复杂。有人可以用简单的方式解释投影背后的想法吗?如果有一些合适的例子就好了。 预先感谢

java generics kotlin
2个回答
3
投票

泛型可能是所有拥有泛型的编程语言中最具智力性的话题。如果您了解 Java,您将轻松掌握 Kotlin 泛型:

  • 类型投影
    <out T>
    反映为 Java 中的
    <? extends T>
  • 类型投影
    <in T>
    反映为 Java 中的
    <? super T>
  • 星形投影
    <*>
    反射到 Java 中的
    <?>

如果您不了解 Java,请再次阅读《Kotlin in Action》一书的第 9 章。类型差异在那里得到了很好的解释。但是,关于星投影部分的列表9.19(第251页)的评论似乎有问题。

>>> val stringValidator = validators[String::class] as FieldValidator<String>
>>> println(stringValidator.validate(""))
false

他们说:

编译器会发出有关未经检查的强制转换的警告。

确实如此。编译器发出警告,但同一段的下一句话似乎不正确:

但是请注意,此代码仅在验证时才会失败,而在进行强制转换时不会失败,因为在运行时所有通用类型信息都会被删除。

如果这意味着前面的代码片段应该返回 true 而不是 false,那么他们就错了。输出是准确的,但解释似乎有误导性,或者我错过了理解一些东西。

附注 以下是理解前面的代码片段所需的一些额外代码:

interface FieldValidator<in T> {
   fun validate(input: T): Boolean
}

object DefaultStringValidator : FieldValidator<String> {
   override fun validate(input: String) = input.isNotEmpty()
}

val validators = mutableMapOf<KClass<*>, FieldValidator<*>>()

validators[String::class] = DefaultStringValidator

不确定,但也许所有这些都是书中使用的 Kotlin v1.0 中的问题。我已经用v1.2.50测试过了。


0
投票

您可以查看以下博客以更简单的方式理解这个概念:

https://medium.com/@android-dev-nexus/kotlin-generics-part-2-variance-and-star-projections-213209276050

© www.soinside.com 2019 - 2024. All rights reserved.