我已经读过这本书(Kotlin in Action,MEAP),关于类型投影和星形投影的文档和文章,但是投影似乎写得非常复杂。有人可以用简单的方式解释投影背后的想法吗?有一些合适的例子会很高兴。 提前致谢
答案 0 :(得分:1)
泛型可能是在拥有泛型的每种编程语言中最有趣的话题。如果您了解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,则它们是错误的。输出是准确的,但解释似乎有误导性,或者我错过了理解的地方。
p.s。 这是理解以前的代码段所需的一些其他代码:
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进行了测试。