我已经阅读了关于类型投影和星形投影的书(Kotlin in Action,MEAP)、文档和文章,但投影似乎仍然写得很复杂。有人可以用简单的方式解释投影背后的想法吗?如果有一些合适的例子就好了。 预先感谢
泛型可能是所有拥有泛型的编程语言中最具智力性的话题。如果您了解 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测试过了。