নিম্নলিখিত ন্যূনতম কোটলিন উদাহরণ বিবেচনা করুন:
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));
}
জ্যাকোতে আমার শাখা কভারেজের নিয়ম রয়েছে, যা উপরের কোডটির জন্য ব্যর্থ হয়েছে, বলছে যে 2 টির মধ্যে 1 টি someWrapper
কলের লাইনে আচ্ছাদিত নয় । দুর্ভাগ্যক্রমে, আমার কাছে সমস্ত শ্রেণি বাদ দেওয়া উচিত নয় যা someWrapper
বলা হয় lude
পচনশীল জাভা কোডটি দেখছেন:
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 দ্বারা অপ্রয়োজনীয় (সর্বদা সত্য) হিসাবে চিহ্নিত করা হয়।
কোডটি কোনওভাবে এমনভাবে সামঞ্জস্য করা সম্ভব যে সমস্ত শাখাগুলি coverাকা দেওয়া সম্ভব। কম্পাইলার অতিরিক্ত নাল চেক তৈরি করে না তা নিশ্চিত করে? আমি উভয়ের কোড পরিবর্তন করতে পারি foo(..)
এবং someWrapper(..)
যতক্ষণ না আমি সজ্জিত ল্যাম্বডা সরবরাহ করতে সক্ষম হয়।
আমি কোটলিন 1.3.50 এবং জ্যাকো 0.8.4 ব্যবহার করি।
সম্পাদনা করুন।
একটি সুস্পষ্ট কর্মসূচী হ'ল supplyAsync(someWrapper { ... })
কিছু ব্যবহার শ্রেণিতে নিষ্কাশন করা এবং সেই শ্রেণিকে কেবল বাদ দেওয়া, যেমন:
fun <U> supplyAsync(supplier: () -> U, executor: TaskExecutor): CompletableFuture<U> {
return CompletableFuture.supplyAsync(someWrapper { supplier() }, executor::execute)
}
এটি আমার পক্ষে যথেষ্ট ভাল, যদিও আমি এখনও আগ্রহী যে কেন কোটলিন দ্বারা শাখাটি যুক্ত করা হয়েছে, যেখানে কোনও শাখা হওয়ার দরকার নেই branch
Type inference failed
আপনার নমুনা কোডটি সংকলন করার চেষ্টা করার সময় আমি পেয়েছি । আপনি যদি বাক্সের বাইরে কাজ করে এমন নমুনা কোড সরবরাহ করতে পারেন তবে দুর্দান্ত হবে! উদাহরণস্বরূপ,taskExecutor
এবংcontroller
অজানা।