gpt4 book ai didi

kotlin - 为什么这段代码不能运行,是不是 Kotlin 的 bug?

转载 作者:行者123 更新时间:2023-12-02 12:46:28 26 4
gpt4 key购买 nike

我写了一段代码,然后编译它没有错误。但是当我运行时,它会引发异常(java.lang.NoClassDefFoundError: TesKt$test$1$1)。

这是语言错误吗?

private fun test(block:()->Unit) = arrayOf(1).map {

object {

fun print() {
println("Hello print")
block()
}
}
}

fun main(args: Array<String>) {
val array = test{println("Hello main")}
array[0].print()
}

最佳答案

我将得出结论,这是 Kotlin 编译器中的一个错误。我对这段代码玩了很多,并查看了编译后的字节码。似乎编译器正在丢失一些关于由 object 定义的匿名类的信息。 .

如果我们向该对象添加一个类型,那么它可以正常工作:

interface Printable {
fun print()
}

private fun test(block:()->Unit): List<Printable> {
return arrayOf(1).map {

object: Printable {

override fun print() {
println("Hello print")
block()
}
}
}
}

fun main(args: Array<String>) {
val array = test{println("Hello main")}
array[0].print()
}

如您所见,我只定义了一个简单的 Printable接口(interface)并用这个接口(interface)注解匿名类。

让我们调用您的代码:版本 A ,我的这个代码:版本 B .

我编译了代码 A然后反编译成 Java .结果如下:
import TestKt.test.1.1;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import kotlin.Metadata;
import kotlin.Unit;
import kotlin.jvm.functions.Function0;
import kotlin.jvm.internal.Intrinsics;
import org.jetbrains.annotations.NotNull;

@Metadata(
mv = {1, 1, 15},
bv = {1, 0, 3},
k = 2,
d1 = {"\u0000#\n\u0000\n\u0002\u0010\u0002\n\u0000\n\u0002\u0010\u0011\n\u0002\u0010\u000e\n\u0002\b\u0002\n\u0002\u0010 \n\u0002\b\u0002\n\u0002\u0018\u0002*\u0001\b\u001a\u0019\u0010\u0000\u001a\u00020\u00012\f\u0010\u0002\u001a\b\u0012\u0004\u0012\u00020\u00040\u0003¢\u0006\u0002\u0010\u0005\u001a\u001c\u0010\u0006\u001a\b\u0012\u0004\u0012\u00020\b0\u00072\f\u0010\t\u001a\b\u0012\u0004\u0012\u00020\u00010\nH\u0002"},
d2 = {"main", "", "args", "", "", "([Ljava/lang/String;)V", "test", "", "TestKt$test$1$1", "block", "Lkotlin/Function0;"}
)
public final class TestKt {
/*#19:*/private static final List<1> test(Function0<Unit> block) {
Object[] $this$map$iv = new Integer[]{1};
int $i$f$map = false;
Collection destination$iv$iv = (Collection)(new ArrayList($this$map$iv.length));
int $i$f$mapTo = false;
Integer[] var6 = $this$map$iv;
int var7 = $this$map$iv.length;

for(int var8 = 0; var8 < var7; ++var8) {
Object item$iv$iv = var6[var8];
int it = ((Number)item$iv$iv).intValue();
int var11 = false;
/*#31:*/ TestKt.test..inlined.map.lambda.1 var13 = new TestKt.test..inlined.map.lambda.1(block);
destination$iv$iv.add(var13);
}

return (List)destination$iv$iv;
}

public static final void main(@NotNull String[] args) {
Intrinsics.checkParameterIsNotNull(args, "args");
List array = test((Function0)TestKt.main.array.1.INSTANCE);
/*#41:*/((1)array.get(0)).print();
}
}

这是代码 B 的相同过程的结果:
import TestKt.test..inlined.map.lambda.1;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import kotlin.Metadata;
import kotlin.Unit;
import kotlin.jvm.functions.Function0;
import kotlin.jvm.internal.Intrinsics;
import org.jetbrains.annotations.NotNull;

@Metadata(
mv = {1, 1, 15},
bv = {1, 0, 3},
k = 2,
d1 = {"\u0000\"\n\u0000\n\u0002\u0010\u0002\n\u0000\n\u0002\u0010\u0011\n\u0002\u0010\u000e\n\u0002\b\u0002\n\u0002\u0010 \n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\u001a\u0019\u0010\u0000\u001a\u00020\u00012\f\u0010\u0002\u001a\b\u0012\u0004\u0012\u00020\u00040\u0003¢\u0006\u0002\u0010\u0005\u001a\u001c\u0010\u0006\u001a\b\u0012\u0004\u0012\u00020\b0\u00072\f\u0010\t\u001a\b\u0012\u0004\u0012\u00020\u00010\nH\u0002"},
d2 = {"main", "", "args", "", "", "([Ljava/lang/String;)V", "test", "", "LPrintable;", "block", "Lkotlin/Function0;"}
)
public final class TestKt {
/*#19:*/private static final List<Printable> test(Function0<Unit> block) {
Object[] $this$map$iv = new Integer[]{1};
int $i$f$map = false;
Collection destination$iv$iv = (Collection)(new ArrayList($this$map$iv.length));
int $i$f$mapTo = false;
Integer[] var6 = $this$map$iv;
int var7 = $this$map$iv.length;

for(int var8 = 0; var8 < var7; ++var8) {
Object item$iv$iv = var6[var8];
int it = ((Number)item$iv$iv).intValue();
int var11 = false;
/*#31:*/ 1 var13 = new 1(block);
destination$iv$iv.add(var13);
}

return (List)destination$iv$iv;
}

public static final void main(@NotNull String[] args) {
Intrinsics.checkParameterIsNotNull(args, "args");
List array = test((Function0)TestKt.main.array.1.INSTANCE);
/*#41:*/((Printable)array.get(0)).print();
}
}

如您所见,唯一的区别在于第一行以及第 19、31 和 41 行(注释如 #19: 等)。

在代码 A名称为 1 的类型(奇怪)是期待。但是这种类型 1 ,打包为 TestKt.test.1.1 , 未找到,因此您收到错误消息 ( NoClassDefFoundError: TesKt$test$1$1)。

客栈代码 B ,但是, Printable 的更清晰类型预期和发现。

如果编译器编译了第一行代码 A就像代码 B ( import TestKt.test..inlined.map.lambda.1; 而不是 import TestKt.test.1.1; )那么您的代码就会起作用。

关于kotlin - 为什么这段代码不能运行,是不是 Kotlin 的 bug?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58786432/

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