// WITH_STDLIB // FILE: First.java public class First implements Comparable { public static First compose(int something) { return null; } } // FILE: Second.java public class Second implements Comparable { public static Second compose(String something) { return null; } } // FILE: complexMapping.kt private fun > range(vararg ranges: Pair): Ranges = null!! private abstract class Ranges> { abstract fun > map(transform: (C) -> M): Ranges } private val INF: Nothing? = null private val foo = listOf( range(0 to 1) to range(INF to ""), range(2 to 3) to range(INF to "", "" to INF), range(4 to 5) to range("" to INF), range(6 to INF) to range("" to INF) ).map { it.first.map(First::compose) to it.second.map(Second::compose) }