// FIR_IDENTICAL // NI_EXPECTED_FILE // JAVAC_EXPECTED_FILE // FILE: Base.java public interface Base {} // FILE: Other.java public interface Other {} // FILE: Derived.java public final class Derived implements Base, Other {} // FILE: Exotic.java public final class Exotic implements Base, Other { int x; Exotic(int x) { this.x = x; } } // FILE: Properties.java import kotlin.jvm.functions.Function0; public class Properties { static Val calcVal(Function0 initializer) { return new Val(initializer); } } // FILE: Val.java import kotlin.jvm.functions.Function0; public class Val { Function0 initializer; Val(Function0 initializer) { this.initializer = initializer; } T getValue(Object instance, Object metadata) { return initializer.invoke(); } } // FILE: My.kt open class Wrapper(val v: T) class DerivedWrapper(v: Derived<*>): Wrapper>(v) class ExoticWrapper(v: Exotic): Wrapper(v) object MyBase { fun derived() = Derived() fun exotic(x: Int) = Exotic(x) fun derivedWrapper() = DerivedWrapper(derived()) fun exoticWrapper(x: Int) = ExoticWrapper(exotic(x)) } class My(val x: Int) { val wrapper/*: Wrapper<*>*/ by Properties.calcVal { val y = x + 1 when { y > 0 -> MyBase.derivedWrapper() x < 0 -> MyBase.exoticWrapper(x) else -> throw java.lang.NullPointerException("") } } }