gpt4 book ai didi

generics - 如何避免 kotlin 泛型的类型不匹配错误?

转载 作者:行者123 更新时间:2023-12-01 21:58:24 25 4
gpt4 key购买 nike

代码片段

fun main() {
val myClass : AbsClass<Any> = MyClass()
// Error - type mismatch

val myClass : AbsClass<*> = MyClass()
// Not Error, but parameter of 'foo' is 'Nothing'

val myClass : AbsClass<Any> = MyClass() as AbsClass<Any>
// It's correct works with unchecked cast warning and unnecessary casting code.

myClass.foo(MyModel())
}

class MyClass() : AbsClass<MyModel>() {
}

abstract class AbsClass<T> {
fun foo(value:T){}
}

data class MyModel(val number:Int = 0)

问题

我想写代码为 val myClass : AbsClass<Any> = MyClass()但是,它显示类型不匹配错误。如何解决这个问题(避免类型转换代码 as AbsClass<Any> )?

最佳答案

你应该使用:

val myClass: AbsClass<out Any> = MyClass()` or `val myClass: AbsClass<in Nothing> = MyClass()

out关键字意味着您希望可以将任何子类型分配给父类(super class)型。 MyModel可以赋值给Any,所以没问题。

in关键字意味着您希望可以将任何父类(super class)型分配给子类型(在我们的例子中为 Nothing),因此您可以使用 MyModel因为它是 Nothing 的父类(super class)型.

这样,如果不提供任何预期类型的​​信息(您可以指定,例如 AbsClass<T : MyAbstractModel> ),在我看来,没有转换或反射的可能性真的很少。

这是类型差异,它是 OOP 中最困难的思想之一。您可以在这里阅读更多内容: https://kotlinlang.org/docs/reference/generics.html#variance

关于generics - 如何避免 kotlin 泛型的类型不匹配错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54996863/

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