class A : Java2 {
  constructor() /* primary */ {
    super/*Java2*/()
    /* <init>() */

  }

}

class B : Java2 {
  constructor() /* primary */ {
    super/*Java2*/()
    /* <init>() */

  }

  override fun bar(): ArrayList<out Number> {
    return arrayListOf<Int>(elements = [2])
  }

  override fun bar2(): ArrayList<in Number> {
    return arrayListOf<Number>(elements = [2])
  }

  override fun bar3(): List<*> {
    return arrayListOf<String>(elements = ["2"])
  }

  override fun foo(a: ArrayList<out Number>) {
  }

  override fun foo2(a: ArrayList<in Number>) {
  }

  override fun foo3(a: List<*>) {
  }

}

class C : Java1 {
  constructor() /* primary */ {
    super/*Java1*/()
    /* <init>() */

  }

}

class D : Java1 {
  constructor() /* primary */ {
    super/*Java1*/()
    /* <init>() */

  }

  override fun bar(): ArrayList<out Number> {
    return arrayListOf<Int>(elements = [3])
  }

  override fun foo(a: ArrayList<out Number>) {
  }

}

open class KotlinClass {
  constructor() /* primary */ {
    super/*Any*/()
    /* <init>() */

  }

  open fun bar(): ArrayList<out Number> {
    return arrayListOf<Int>(elements = [1])
  }

  open fun bar2(): ArrayList<in Number> {
    return arrayListOf<Number>(elements = [1])
  }

  open fun bar3(): List<*> {
    return arrayListOf<Int>(elements = [1])
  }

  open fun foo(a: ArrayList<out Number>) {
  }

  open fun foo2(a: ArrayList<in Number>) {
  }

  open fun foo3(a: List<*>) {
  }

}

fun test(a: A, b: B, c: C, d: D) {
  a.foo(a = arrayListOf<Int>(elements = [1]))
  a.bar() /*~> Unit */
  a.foo2(a = arrayListOf<Number>(elements = [1]))
  a.bar2() /*~> Unit */
  a.foo3(a = listOf<Nothing?>(element = null))
  a.foo3(a = listOf<Int>(element = 1))
  a.foo3(a = mutableListOf<String>(elements = [""]))
  a.bar3() /*~> Unit */
  b.foo(a = arrayListOf<Int>(elements = [1]))
  b.bar() /*~> Unit */
  b.foo2(a = arrayListOf<Number>(elements = [1]))
  b.bar2() /*~> Unit */
  b.foo3(a = listOf<Nothing?>(element = null))
  b.foo3(a = listOf<Int>(element = 1))
  b.foo3(a = mutableListOf<String>(elements = [""]))
  b.bar3() /*~> Unit */
  c.foo(a = arrayListOf<Int>(elements = [1]))
  c.bar() /*~> Unit */
  c.foo2(a = arrayListOf<@EnhancedNullability Number>(elements = [1]))
  c.bar2() /*~> Unit */
  c.foo3(a = listOf<Nothing?>(element = null))
  c.foo3(a = listOf<Int>(element = 1))
  c.foo3(a = mutableListOf<String>(elements = [""]))
  c.bar3() /*~> Unit */
  d.foo(a = arrayListOf<Int>(elements = [1]))
  d.bar() /*~> Unit */
}
