Kotlin / Android – 带有lambda的数据类中的KotlinReflectionInternalError

kotlin.reflect.jvm.internal.KotlinReflectionInternalError:反思本地函数,lambdas,匿名函数和局部variables在Kotlinreflection中还没有完全支持

这个exception来自数据类的toString()

数据类包含一个lambda。

我不能在我的环境中重现它。

我是否需要重写toString()来排除lambda? 或者lambda在数据类中是不允许的?

 data class PersistJob( private val id: Int, private val delay: Long = 10_000L, private val maxDelay: Long = 60_000L, private val iteration: Int = 0, private val block: suspend (Int) -> Boolean) { fun getDelay() = minOf(delay, maxDelay) fun withDelayIncreased() = copy( delay = minOf(delay * 2, maxDelay), iteration = iteration + 1) suspend fun execute() = block(iteration) } 

产生错误的行:

 val job: PersistJob = ... log.debug("start job id($id): $job")`// job.toString() 

堆栈跟踪:

 at kotlin.reflect.jvm.internal.EmptyContainerForLocal.fail(SourceFile:41) at kotlin.reflect.jvm.internal.EmptyContainerForLocal.getFunctions(SourceFile:37) at kotlin.reflect.jvm.internal.KDeclarationContainerImpl.findFunctionDescriptor(SourceFile:145) at kotlin.reflect.jvm.internal.KFunctionImpl$descriptor$2.invoke(SourceFile:54) at kotlin.reflect.jvm.internal.KFunctionImpl$descriptor$2.invoke(SourceFile:34) at kotlin.reflect.jvm.internal.ReflectProperties$LazySoftVal.invoke(SourceFile:93) at kotlin.reflect.jvm.internal.ReflectProperties$Val.getValue(SourceFile:32) at kotlin.reflect.jvm.internal.KFunctionImpl.getDescriptor(SourceFile) at kotlin.reflect.jvm.internal.ReflectionFactoryImpl.renderLambdaToString(SourceFile:59) at kotlin.jvm.internal.Reflection.renderLambdaToString(SourceFile:80) at kotlin.jvm.internal.Lambda.toString(SourceFile:22) at java.lang.String.valueOf(String.java:2683) at java.lang.StringBuilder.append(StringBuilder.java:129) 

它看起来像Kotlin lambda的一个bug。

这段代码足以重现exception:

  ({i: Int -> true}).toString() 

我建议你在youtrack.jetbrains.com/issues/KT上发布一个问题,看看团队说了些什么。