Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics Kotlin T值不能与返回任何_Generics_Kotlin - Fatal编程技术网

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
是与Javas
Object
等价的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
是与Javas
Object
等价的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?