Java Kotlin型方差与恒星投影

Java Kotlin型方差与恒星投影,java,generics,kotlin,Java,Generics,Kotlin,我读过这本书(Kotlin in in Action,MEAP),文档和关于类型投影和恒星投影的文章,但投影似乎写得非常复杂。有人能用一种简单的方式解释投影背后的想法吗?最好有一些合适的例子。 提前感谢泛型可能是每种编程语言中最具智慧的话题。如果您了解Java,您将很容易学会Kotlin泛型: 在Java中,类型投影反映到 如果您不懂Java,请再次阅读《Kotlin in Action》一书的第9章。类型差异在这里得到了很好的解释。但是,关于恒星投影的部分中关于清单9.19(第251页)的

我读过这本书(Kotlin in in Action,MEAP),文档和关于类型投影和恒星投影的文章,但投影似乎写得非常复杂。有人能用一种简单的方式解释投影背后的想法吗?最好有一些合适的例子。
提前感谢

泛型可能是每种编程语言中最具智慧的话题。如果您了解Java,您将很容易学会Kotlin泛型:

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

val stringValidator=验证程序[String::class]作为FieldValidator >>>println(stringValidator.validate(“”) 假的 他们说:

编译器将发出有关未选中强制转换的警告

没错。编译器发出警告,但同一段落的下一句似乎不正确:

但是,请注意,此代码仅在验证时失败,而不是在进行转换时失败,因为在运行时,所有泛型类型信息都会被擦除

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

p、 美国。 下面是理解前面的代码段所需的一些附加代码:

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
接口字段验证程序{
趣味验证(输入:T):布尔值
}
对象DefaultStringValidator:FieldValidator{
override-fun-validate(输入:字符串)=input.isNotEmpty()
}
val validators=mutableMapOf()
验证器[String::class]=DefaultStringValidator
不确定,但可能所有这些都是书中使用的Kotlin v1.0中的一个问题。我已经用v1.2.50对它进行了测试

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