Generics Kotlin编译器混淆了具体化的类型参数

Generics Kotlin编译器混淆了具体化的类型参数,generics,kotlin,kotlin-reified-type-parameters,Generics,Kotlin,Kotlin Reified Type Parameters,我想我可能遇到了一个关于具体化类型参数的编译器错误。用一个代码示例可能是最容易解释的: fun main(){ println(“相同:”); proxySame(); directSame(); println(“\n不同:”); proxyDiff(); directDiff(); } inline fun proxySame()=directSame(); 内联的乐趣也一样( func:()->单位={ println(Z::class.java.simpleName) } )=func(

我想我可能遇到了一个关于具体化类型参数的编译器错误。用一个代码示例可能是最容易解释的:

fun main(){
println(“相同:”);
proxySame();
directSame();
println(“\n不同:”);
proxyDiff();
directDiff();
}
inline fun proxySame()=directSame();
内联的乐趣也一样(
func:()->单位={
println(Z::class.java.simpleName)
}
)=func();
inline fun proxyDiff()=directDiff();
内联趣味directDiff(
func:()->单位={
println(Z::class.java.simpleName)
}
)=func();
这个例子显然不是一个真实的场景,但它是我能找到的最简单的程序,仍然表现出意外的行为

此代码中有两种类型的函数:
directX
proxyX
,其中
X
Diff
相同。
相同的
函数和
Diff
函数之间的唯一区别是directX函数的第一个类型参数的名称。对于
Same
而言,它与
proxyX
函数相同;对于
Diff
而言,它不同

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

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

Different:
Integer        (proxy, correct)
Integer        (direct, correct)
正如您所看到的,通过代理函数调用时,输出是不同的,但仅当具体化的类型参数具有相同的名称时,。 代理函数的P值以某种方式终止于直接函数的Z。但是,这只发生在lambda函数内部,在常规函数体中打印类名将导致预期结果

我在这里完全不知所措。我找不到任何其他解释,除了它是一个编译器错误。我是否真的遇到了一些晦涩难懂的错误,或者我不知何故错过了一些东西


编辑:我已经为此打开了一个错误报告。

如果您查看反编译的字节码,您可以看到
proxyDiff()
似乎考虑了通用参数
p
,而
proxymeam()
没有

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();
内联的乐趣也一样(
func:()->单位={
println(Z::class.java.simpleName)
}
)=func();
在引擎盖下变成这样:

inline fun proxySame() = directSame<String>();
inline fun <reified Z> directSame(
        func: () -> Unit = {
            println(Z::class.java.simpleName)
        }
) = func(); 
inline fun proxySame()=directSame();
内联的乐趣也一样(
func:()->单位={
println(Z::class.java.simpleName)
}
)=func();

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

在我看来像是一个编译器bug,我建议在他们的bug追踪器上以bug的形式打开它