gpt4 book ai didi

Kotlin 对推断的(现场)参数进行强制失败

转载 作者:IT老高 更新时间:2023-10-28 13:45:21 28 4
gpt4 key购买 nike

我不确定“硬失败”是否是正确的词,但这是我面临的问题。我花了相当长的时间来重现这个尽可能最小的例子,所以它是这样的:

class BaseParameterizedType<T>

fun <U: BaseParameterizedType<*>> getSpecific(clazz: KClass<in U>) : U {
TODO()
}

fun example(arg: KClass<out BaseParameterizedType<*>>)) {
getSpecific(arg.innerType)
}

好的,所以上面的代码在“TODO”处失败,但如果它不存在并且函数正常返回,那么它肯定会失败并出现空指针异常。我努力弄清楚出了什么问题,所以我转向了反编译的 Java 代码(来自 kotlin 字节码):

public static final void example(@NotNull KClass arg) {
Intrinsics.checkParameterIsNotNull(arg, "arg");
getSpecific(arg.getInnerType());
throw null; // <-- The problem
}

如果我更改 getSpecific(clz: KClass<in U>) : U 的函数签名对以下任何一种形式:

  1. getSpecific(clz: KClass<out U>) : U
  2. getSpecific(clz: KClass<U>) : U
  3. getSpecific(clz: KClass<in U>) : BaseParameterizedType<*>

甚至是 example(arg: KClass<out BaseParameterizedType<*>) 的函数或 example(arg: KClass<BaseParameterizedType<*>>) ,那么生成的代码就是:

public static final void example(@NotNull KClass arg) {
Intrinsics.checkParameterIsNotNull(arg, "arg");
getSpecific(arg.getInnerType());
}

现在,假设在调用站点,我将其更改为:

getSpecific(BaseParameterizedType::class)

那么这也不会生成 throw null条款。所以,我猜这与 kotlin 有什么关系,假设这种转换总是会失败,或者有不确定的信息可用于进行推断?

所以,我们知道 arg.innerTypeKClass<out BaseParameterizedType<*>>我们在接受 KClass<in BaseParameterizedType<*>> 的网站上使用它,那为什么不是 U推断为 BaseParamterizedType<*>> .这实际上是唯一可以匹配的类型。

同时,我认为只是生成一个throw null语句难以调试。堆栈跟踪将仅指向存在 getSpecific 的行祝你好运找出空指针异常的来源。

最佳答案

当推断类型为 Nothing 时,这是关于类型推断极端情况处理的已知问题。 (在你的情况下):

enter image description here

由于对预测 KClass<in U> 的强制尝试,推理会以这种方式运行。和 KClass<out BaseParameterizedType<*>> .

基本上,out -投影类型同时表示in Nothing (因为实际的类型参数可以是任何子类型,并且没有任何东西可以安全地传递in)。所以,要匹配 KClass<out BaseParameterizedType<*>>KClass<in U>编译器选择 U := Nothing , 表示函数调用返回 Nothing也是。

备注:a Foo<out Any>投影无法匹配 Foo<in T>T := Any , 因为为 Foo<out Any> 传递的值的实际类型参数例如,可以是 Int .那么,如果 Foo<T>接受 T在它的某些功能中,允许上述匹配也将允许您通过Any实例到哪里 Foo<Int>没想到他们。实际上,in Nothing成为匹配它们的唯一方法,因为 out 的未知性质-投影类型。

之后,对于 Nothing -返回函数调用,编译器插入 throw null字节码以确保执行不会继续(评估 Nothing 类型的表达式 is supposed to never finish correctly )。

查看问题:KT-20849 , KT-18789

关于Kotlin 对推断的(现场)参数进行强制失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46853846/

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