gpt4 book ai didi

generics - Kotlin 编译器混合具体化类型参数

转载 作者:行者123 更新时间:2023-12-03 06:23:44 27 4
gpt4 key购买 nike

我想我可能遇到了有关具体化类型参数的编译器错误。用代码示例来解释可能是最简单的:

fun main() {
println("Same:");

proxySame<Int>();
directSame<String, Int>();

println("\nDifferent:");

proxyDiff<Int>();
directDiff<String, Int>();
}


inline fun <reified P> proxySame() = directSame<String, P>();
inline fun <reified P, reified Z> directSame(
func: () -> Unit = {
println(Z::class.java.simpleName)
}
) = func();


inline fun <reified P> proxyDiff() = directDiff<String, P>();
inline fun <reified Q, reified Z> directDiff(
func: () -> Unit = {
println(Z::class.java.simpleName)
}
) = func();

这个示例显然不是现实世界的场景,但它是我能找到的最简单的程序,但仍然表现出意外的行为。

在此代码中有两种类型的函数:directXproxyX ,其中XSameDiffSame 之间的唯一区别和Diff函数是 directX 的第一个类型参数的名称功能。对于 SameproxyX 相同函数,用于Diff这是不同的。

无论是否directX,人们都会期望输出是相同的。是否通过代理函数调用。不幸的是,情况显然并非总是如此:

Same:
String (proxy, wrong)
Integer (direct, correct)

Different:
Integer (proxy, correct)
Integer (direct, correct)

正如您所看到的,通过代理函数调用时,输出是不同的, 但前提是具体化类型参数具有相同的名称。代理函数的 P 值以某种方式结束于直接函数的 Z 中。但是, 这只发生在 lambda 函数内部,在常规函数体内打印类名会得到预期的结果。

我在这里完全不知所措。除了编译器错误之外,我找不到任何其他解释。我真的遇到了一些不起眼的错误,还是我在这里错过了一些东西?

编辑:我已经为此打开了错误报告 here .

最佳答案

如果你看一下反编译的字节码,你会发现 proxyDiff() 似乎考虑了泛型参数 PproxySame() 没有。

public final void proxyDiff() {
// ...
Intrinsics.reifiedOperationMarker(4, "P");
String var5 = Object.class.getSimpleName();
// ...
}

public final void proxySame() {
// ...
String var5 = String.class.getSimpleName();
// ...
}

我的猜测是它在内联期间被优化掉了。

编译器发现 P 未在 directSame() 中使用,因此推断它也未在 proxySame() 中使用。所以这个:

inline fun <reified P> proxySame() = directSame<String, P>();
inline fun <reified P, reified Z> directSame(
func: () -> Unit = {
println(Z::class.java.simpleName)
}
) = func();

在幕后变成这样:

inline fun proxySame() = directSame<String>();
inline fun <reified Z> directSame(
func: () -> Unit = {
println(Z::class.java.simpleName)
}
) = func();

所以,是的,我肯定会说这是一个错误。

关于generics - Kotlin 编译器混合具体化类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59931718/

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