La inferencia del tipo Kotlin falló

Digamos que tenemos una biblioteca Java de terceros con dicha class:

//---------------------------------------------------------------------------------------- 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 */ } } } //---------------------------------------------------------------------------------------- 

Utilizamos con éxito su método Functions.noOp() en nuestra aplicación Java, pero cuando comenzamos a reescribirlo en Kotlin, nos enfrentamos al problema de que el siguiente código no se comstack y nos da dos errores:

 //---------------------------------------------------------------------------------------- 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") } } //---------------------------------------------------------------------------------------- 

pero el mismo código previamente escrito en Java comstack y funciona bien:

 //---------------------------------------------------------------------------------------- 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"); } } //---------------------------------------------------------------------------------------- 

La inferencia de tipo falla incluso si especificamos T explícitamente. El error 2 desaparece cuando NoOpFunc declara como public , pero el error 1 aún permanece.

El problema es un error en Kotlin. Aquí está el enlace al problema: https://youtrack.jetbrains.com/issue/KT-14499 . Por favor vota.

UPD Para solucionar el problema, hay una solución alternativa:

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

Para corregir (1), se debe suprimir la advertencia de compilation, corregir (2), especificar el tipo de forma explícita.