为何Kotlin函数调用时指定参数名会引发编译错误?
Kotlin调用assertEquals指定参数名编译报错的原因与解决办法
你碰到的这个问题,核心原因是你调用的assertEquals是Java标准库中的方法(比如JUnit的org.junit.jupiter.api.Assertions.assertEquals)。Java默认编译时不会把参数名存入字节码,Kotlin调用Java方法时无法识别这些参数名,所以指定expected、actual就会报错;而不指定参数名时,Kotlin只按参数顺序匹配,自然能正常运行。
解决办法
1. 改用Kotlin原生的assertEquals
直接导入kotlin.test包下的assertEquals,这是Kotlin原生方法,参数名是被保留的,支持直接用参数名调用:
import kotlin.test.assertEquals assertEquals( expected = FakeDataSource.photosList, actual = repository.getMarsPhotos(), )
2. 放弃参数名,按顺序传参
如果必须使用Java版的assertEquals,那就保持无参数名的调用方式,按expected在前、actual在后的顺序传参即可:
assertEquals( FakeDataSource.photosList, repository.getMarsPhotos(), )
3. 自定义Java方法时添加参数名注解(仅适用于自己写的Java代码)
如果是你自己编写的Java断言方法,可以给参数添加@org.jetbrains.annotations.ParameterName注解,同时编译Java代码时开启参数名保留(比如用javac -parameters编译),这样Kotlin就能识别参数名了:
import org.jetbrains.annotations.ParameterName; public class CustomAssertions { public static <T> void assertEquals( @ParameterName("expected") T expected, @ParameterName("actual") T actual ) { // 断言逻辑 } }
内容的提问来源于stack exchange,提问作者Mohammadreza Khahani
相关产品推荐
相关产品推荐

