gpt4 book ai didi

types - Kotlin 具体化的类型参数不能用作函数体中的类型参数

转载 作者:行者123 更新时间:2023-12-02 06:50:42 25 4
gpt4 key购买 nike

Kotlin 中具体化的类型参数可防止类型参数删除并允许在运行时知道类型参数。这允许以下代码按预期编译和运行:

inline fun <reified T> isA(value: Any) = value is T

但是,当我尝试使用“T”作为类型参数而不是独立时,我收到一条消息,表明它是一个已删除的类型。以下代码演示了这一点,仅用于说明目的:
inline fun <reified T> isListOfA(name: String): Boolean {
val candidate = Class.forName(name)
return candidate is List<T>
}

这是由于技术限制吗?如果是这样,那是什么限制?

最佳答案

显然,我没有恰本地表述我的问题以获得我想要的形式的答案。这里的大多数答案都是“因为你不能在 Java 中做到这一点”的一些变体。好吧,你不能做 x instanceof T在 Java 中,您也可以这样做 x is T在 Kotlin 。我正在寻找潜在的实际障碍而不是 Java 规则。毕竟,规则是用来打破的。

从我对这里第一个答案的评论来看,重新提出的问题是:如果 objectref is T可以通过某种机制在 Kotlin 中工作 X为什么不能objectref is SomeClass<T>是通过相同的机制工作的?

tl;dr 回答:因为不会有 Class对象 SomeClass<T>在运行时。

更长的答案:首先我们必须了解机制X ,即生成 instanceof is T的字节码指令.这条指令需要objectref和名称 N某类 C ,其中 N由编译器根据上下文确定。在运行时,类 C源自 N将用于评估 objectref is T表达。为了进行此评估,C 的类对象必须实例化。因此,对 objectref is SomeClass<T> 使用相同的机制然后 N将是 SomeClass<T> .由于类型删除,SomeClass<T> 不会有类对象因此无法生成所需的 instanceof指令,从而应用相同的机制。此外,instanceof指令不能采用 SomeClass<T> 形式的名称.因此,如果 objectref is SomeClass<T>是工作,一些其他机制Y必须在 Kotlin 中找到并实现。这种机制可能存在也可能不存在。

我知道有些人可能会说这与其他一些答案是一样的。然而,无论好坏,我的学习风格是了解事物如何在金属上起作用,然后将其与抽象模型进行综合。在这种情况下,Java 泛型的删除概念是抽象模型(或其一部分)。真的,除非我至少了解一种在工作实现中实现它的方式,否则“删除”对我来说感觉很模糊。

关于types - Kotlin 具体化的类型参数不能用作函数体中的类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45173972/

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