다음의 최소 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에 지점 적용 규칙이 있는데, 위 코드에서는 실패합니다 .2 지점 중 1 지점은 someWrapper
통화 라인에 포함되지 않습니다 . 불행히도, 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에 의해 불필요하다고 표시됩니다 (항상 참).
예를 들어 모든 분기를 포함 할 수 있도록 코드를 조정하는 것이 가능합니까? 컴파일러가 여분의 null 검사를 생성하지 않도록함으로써? 나는 모두의 코드를 변경할 수 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이 왜 브랜치를 추가하지 않아도되는지 궁금합니다.
@Enselic은 산만 오류를 제거하기 위해 작은 편집을 추가했습니다. 아이디어를 얻는 데 충분해야하므로 본격적인 코드로 더 확장하지는 않을 것입니다.
—
BKE
Type inference failed
샘플 코드를 컴파일하려고 할 때 얻습니다 . 즉시 사용 가능한 샘플 코드를 제공 할 수 있다면 좋을 것입니다! 예를 들어,taskExecutor
및controller
미지수이다.