Generics Kotlin T值不能与返回任何
所以我有一段不会编译的代码Generics Kotlin T值不能与返回任何,generics,kotlin,Generics,Kotlin,所以我有一段不会编译的代码 suspend fun <T> GetContent(call: ApplicationCall) : T { var requestContent: T? = null try { requestContent = call.receive() } catch (exception: Exception) { println(exception) } } suspend-fun-
suspend fun <T> GetContent(call: ApplicationCall) : T {
var requestContent: T? = null
try {
requestContent = call.receive()
}
catch (exception: Exception) {
println(exception)
}
}
suspend-fun-GetContent(调用:ApplicationCall):T{
var requestContent:T?=null
试一试{
requestContent=call.receive()
}
捕获(异常:异常){
println(例外)
}
}
问题是call.receive()
返回任何
所以我得到一个错误,说“T?不是任何类型的子类型”
因此,我阅读了Any
,关键概念在文档的前两行
“Kotlin类层次结构的根。每个Kotlin类都有一个作为超类的根。”
但它产生了一个悖论,T实际上并没有继承自任何,因为它不是一个类
但另一方面,当使用它时,它肯定是一个类
我是Kotlin的新手,所以我想我只是不完全理解任何概念,或者不完全理解泛型概念中的某些内容。您可能以前使用过Java,对吗?
Any
是与JavasObject
等价的Kotlin,这意味着在Kotlin中,每个对象都隐式继承自Any
,或者换句话说Any
可以用作任何可能类的占位符
在您的情况下,您可以尝试铸造您的结果,我认为这将起作用:
requestContent = call.receive() as T
这一行的意思是,您知道,call.receive()
确实是类T
的对象或它的子类。如果这个假设是错误的,这将抛出一个错误
//编辑:一个更清晰的继承示例
以下面的示例为例,您有一个类Animal
和两个子类Dog
和Cat
。您的继承图现在如下所示:
Animal
/ \
/ \
V V
Dog Cat
所以说:每只猫都是动物,每只狗都是动物。
但是如果你有任何动物,你不能说它是狗还是猫
在您的特定情况下,Any
是Animal
类,f.e.Dog
是您的T
。所以T
确实继承自Any
,但是你不知道它是否真的是T
或者其他东西,但是如果你知道在这个特定的例子中它是T
,你可以将它转换成Java。你可能以前做过Java,对吗?
Any
是与JavasObject
等价的Kotlin,这意味着在Kotlin中,每个对象都隐式继承自Any
,或者换句话说Any
可以用作任何可能类的占位符
在您的情况下,您可以尝试铸造您的结果,我认为这将起作用:
requestContent = call.receive() as T
这一行的意思是,您知道,call.receive()
确实是类T
的对象或它的子类。如果这个假设是错误的,这将抛出一个错误
//编辑:一个更清晰的继承示例
以下面的示例为例,您有一个类Animal
和两个子类Dog
和Cat
。您的继承图现在如下所示:
Animal
/ \
/ \
V V
Dog Cat
所以说:每只猫都是动物,每只狗都是动物。
但是如果你有任何动物,你不能说它是狗还是猫
在您的特定情况下,Any
是Animal
类,f.e.Dog
是您的T
。所以T
确实继承自Any
,但是你不知道它是否真的是T
或者其他东西,但是如果你知道在这个特定的例子中它是T
,你可以将它转换为Any
这是关于可空性的
您找到的文档是关于类的,而不是关于类型的;区别很微妙但很重要。(即使在Java中,这些东西也不完全相同;例如,List
是一个类,而List
是一个类型。)
在Kotlin中,可空性是类型系统的一部分。因此,尽管Any
是最高的类(对应于Java的对象),但Any
和Any
都是类型:区别在于只有后者可以容纳null
。这使得Any
成为Any
的子类型,和Any?
最上面的类型
您的示例具有类型T?
,该类型可为空,因此不是Any
的子类型,该子类型不可为空
然而,这不是你问题中的唯一问题;在您引用的代码中,T?
必须是Any
的超类型,这显然不是。(我还对试图仅参数化返回值感到困惑。编译器如何在每次调用中推断T
的实际类型?来解决Any
的问题:
这是关于可空性的
您找到的文档是关于类的,而不是关于类型的;区别很微妙但很重要。(即使在Java中,这些东西也不完全相同;例如,List
是一个类,而List
是一个类型。)
在Kotlin中,可空性是类型系统的一部分。因此,尽管Any
是最高的类(对应于Java的对象),但Any
和Any
都是类型:区别在于只有后者可以容纳null
。这使得Any
成为Any
的子类型,和Any?
最上面的类型
您的示例具有类型T?
,该类型可为空,因此不是Any
的子类型,该子类型不可为空
然而,这不是你问题中的唯一问题;在您引用的代码中,T?
必须是Any
的超类型,这显然不是。(我还对试图仅参数化返回值感到困惑。编译器如何在每次调用中推断T
的实际类型?)T
是否有Any?
但是Any
不必是T
T
是否有Any?