gpt4 book ai didi

kotlin - 如何覆盖Kotlin生成的不必要的空检查?

转载 作者:行者123 更新时间:2023-12-02 11:49:36 25 4
gpt4 key购买 nike

考虑以下最小的Kotlin示例:

fun <U> someWrapper(supplier: () -> U): () -> (U) {
return { supplier() }
}

fun foo(taskExecutor: TaskExecutor): Int {
val future = CompletableFuture.supplyAsync(someWrapper {
42
}, taskExecutor::execute)
return future.join()
}

@Test
public void shouldFoo() {
assertThat(foo(), is(42));
}

我在Jacoco中有分支覆盖规则,该规则对于上面的代码失败,说 someWrapper调用的行未覆盖2个分支中的1个。不幸的是,对于我来说,不能排除所有从其调用 someWrapper的类。

查看反编译的Java代码:
public final int foo(TaskExecutor taskExecutor) {
Object var10000 = WrappersKt.someWrapper((Function0)null.INSTANCE);
if (var10000 != null) {
Object var2 = var10000;
var10000 = new Foo$sam$java_util_function_Supplier$0((Function0)var2);
}

Supplier var3 = (Supplier)var10000;
Function1 var4 = (Function1)(new Function1(this.taskExecutor) {
// $FF: synthetic method
// $FF: bridge method
public Object invoke(Object var1) {
this.invoke((Runnable)var1);
return Unit.INSTANCE;
}

public final void invoke(Runnable p1) {
((TaskExecutor)this.receiver).execute(p1);
}

public final KDeclarationContainer getOwner() {
return Reflection.getOrCreateKotlinClass(TaskExecutor.class);
}

public final String getName() {
return "execute";
}

public final String getSignature() {
return "execute(Ljava/lang/Runnable;)V";
}
});
CompletableFuture future = CompletableFuture.supplyAsync(var3, (Executor)(new Foo$sam$java_util_concurrent_Executor$0(var4)));
var10000 = future.join();
Intrinsics.checkExpressionValueIsNotNull(var10000, "future.join()");
return ((Number)var10000).intValue();
}

我认为,问题出在 if (var10000 != null)分支,IDE甚至将其标记为不必要的分支(总是如此)。

是否可以通过某种方式调整代码,以便覆盖所有分支,例如。通过确保编译器不会生成该额外的空检查?只要我能够提供修饰的lambda,就可以更改 foo(..)someWrapper(..)的代码。

我使用Kotlin 1.3.50和Jacoco 0.8.4。

编辑。

一个显而易见的解决方法是将 supplyAsync(someWrapper { ... })提取到某些utils类中,并且仅排除该类,即:
fun <U> supplyAsync(supplier: () -> U, executor: TaskExecutor): CompletableFuture<U> {
return CompletableFuture.supplyAsync(someWrapper { supplier() }, executor::execute)
}

这对我来说已经足够了,尽管我仍然很好奇为什么Kotlin会添加分支,而无需分支。

最佳答案

如果someWrapper的返回值仅打算用作Supplier的实例,则可以通过显式使用Supplier作为返回类型来删除不必要的空检查。

fun <U> someWrapper(supplier: () -> U): Supplier<U> {
return Supplier { supplier() }
}

关于kotlin - 如何覆盖Kotlin生成的不必要的空检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58306546/

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