// FULL_JDK // FILE: Element.java public interface Element {} // FILE: DerivedElement.java public interface DerivedElement extends Element {} // FILE: EmptyDiagnostic.java public class EmptyDiagnostic {} // FILE: Diagnostic.java import org.jetbrains.annotations.NotNull; public class Diagnostic extends EmptyDiagnostic { @NotNull public E getElement(); } // FILE: DiagnosticFactory.java import org.jetbrains.annotations.NotNull; public class DiagnosticFactory { @NotNull public D cast(@NotNull EmptyDiagnostic diagnostic) { return (D) diagnostic; } } // FILE: DiagnosticFactory0.java public class DiagnosticFactory0 extends DiagnosticFactory> {} // FILE: test.kt class Fix(e: DerivedElement) fun create(d: Diagnostic) { val element = d.element Fix(element) } fun createGeneric(d: Diagnostic) { val element = d.element Fix(element) } private val DERIVED_FACTORY = DiagnosticFactory0() fun createViaFactory(d: EmptyDiagnostic) { val casted = DERIVED_FACTORY.cast(d) val element = casted.element Fix(element) }