Aşağıdaki minimal Kotlin örneğini düşünün:
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'da yukarıdaki kod için başarısız olan şube kapsamı kurallarım var, 2 şubeden 1'inin someWrapper
çağrı hattında yer almadığını söylüyor . Ne yazık ki, someWrapper
denilen tüm sınıfları dışlamak benim için bir seçenek değil .
Ayrıştırılmış Java koduna bakarak:
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();
}
Bence sorun, if (var10000 != null)
IDE tarafından bile gereksiz (her zaman doğru) olarak işaretlenen şubedir.
Kodu bir şekilde tüm dalları kapsayacak şekilde ayarlamak mümkün mü, örn. derleyicinin bu ekstra boş denetimi oluşturmamasını sağlayarak? Ben ikisinin kodunu değiştirebilir foo(..)
ve someWrapper(..)
ben süslü bir lambda tedarik edebiliyoruz duyuyorum sürece.
Kotlin 1.3.50 ve Jacoco 0.8.4 kullanıyorum.
DÜZENLE.
Belli bir geçici çözüm, supplyAsync(someWrapper { ... })
bazı utils sınıfına ayıklamak ve yalnızca bu sınıfı hariç tutmaktır.
fun <U> supplyAsync(supplier: () -> U, executor: TaskExecutor): CompletableFuture<U> {
return CompletableFuture.supplyAsync(someWrapper { supplier() }, executor::execute)
}
Bu benim için yeterince iyi olurdu, ancak dalın neden dalın olması gerekmediği Kotlin tarafından eklendiğini merak ediyorum.
Type inference failed
Örnek kodunuzu derlemeye çalıştığımda anladım . Kutunun dışında çalışan örnek kod sağlayabilirseniz harika olurdu! Örneğin,taskExecutor
vecontroller
bilinmeyenler.