Вывод типа Kotlin не выполнен

Допустим, у нас есть сторонняя библиотека Java с таким классом:

//---------------------------------------------------------------------------------------- package foo; public final class Functions { public interface VoidFunc0 { void call(); } public interface VoidFunc1<T> { void call(T t); } @SuppressWarnings("unchecked") public static <T> NoOpFunc<T> noOp() { return new NoOpFunc(); } /*public*/ static final class NoOpFunc<T> implements VoidFunc0, VoidFunc1<T> { @Override public void call() { /* deliberately no op */} @Override public void call(T t) { /* deliberately no op */ } } } //---------------------------------------------------------------------------------------- 

Мы успешно использовали свой метод Functions.noOp() в нашем приложении Java, но когда мы начали переписывать его в Котлине, мы столкнулись с проблемой, что приведенный ниже код не компилируется и дает нам две ошибки:

 //---------------------------------------------------------------------------------------- package bar import foo.Functions object KotlinApp { @JvmStatic fun main(args: Array<String>) { /* * Error:(XX, XX) Kotlin: Type inference failed: Not enough information * to infer parameter T in fun <T : Any!> noOp(): Functions.NoOpFunc<T!>! * Please specify it explicitly. */ callVoidFunc0(Functions.noOp()) // ERROR 1 /* * Error:(XX, XX) Kotlin: Type Functions.NoOpFunc<Any!>! is inaccessible * in this context due to: Functions.NoOpFunc<Any!>! */ callVoidFunc1(Functions.noOp()) // ERROR 2 } fun callVoidFunc0(func0: Functions.VoidFunc0) { func0.call() } fun callVoidFunc1(func1: Functions.VoidFunc1<Any>) { func1.call("A") } } //---------------------------------------------------------------------------------------- 

но тот же код, ранее написанный на Java, компилируется и работает хорошо:

 //---------------------------------------------------------------------------------------- package bar; import foo.Functions; public class JavaApp { public static void main(String[] args) { callVoidFunc0(Functions.noOp()); // OK callVoidFunc1(Functions.noOp()); // OK } public static void callVoidFunc0(Functions.VoidFunc0 func0) { func0.call(); } public static void callVoidFunc1(Functions.VoidFunc1<Object> func1) { func1.call("A"); } } //---------------------------------------------------------------------------------------- 

Вывод типа невозможен, даже если мы укажем T явно. Ошибка 2 исчезает, когда NoOpFunc объявляется public , но ошибка 1 все еще остается.

Проблема – ошибка в Котлине. Вот ссылка на проблему: https://youtrack.jetbrains.com/issue/KT-14499 . Пожалуйста, голосуйте.

UPD Чтобы устранить проблему, существует способ:

 @JvmStatic fun main(args: Array<String>) { @Suppress("INACCESSIBLE_TYPE") callVoidFunc0(Functions.noOp()) // (1) @Suppress("INACCESSIBLE_TYPE") callVoidFunc1(Functions.noOp<Any>()) // (2) } 

Чтобы исправить (1), нужно подавить предупреждение о компиляции, чтобы исправить (2) – дополнительно указать тип явно.

Intereting Posts