// TARGET_BACKEND: JVM // WITH_STDLIB // MODULE: lib // FILE: CachedValuesManager.java import org.jetbrains.annotations.NotNull; public class CachedValuesManager { public @NotNull CachedValue createCachedValue(final @NotNull CachedValueProvider provider) { return new CachedValue() { public T getValue() { return provider.compute().value; } }; } } // FILE: CachedValueProvider.java import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Collection; public interface CachedValueProvider { @Nullable Result compute(); class Result { public final T value; public Result(@Nullable T value) { this.value = value; } } } // FILE: CachedValue.java public interface CachedValue { T getValue(); } // FILE: lib.kt // Inferred as CachedValue>! and T!! should be approximated fun cachedValue(manager: CachedValuesManager, createValue: () -> T) = manager.createCachedValue { CachedValueProvider.Result( createValue() ) } // MODULE: main(lib) // FILE: main.kt fun box(): String { val value = cachedValue(CachedValuesManager()) { Pair("O", "K") }.value return value.first + value.second }