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

  }

}

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

  }

  override fun bar(): Int {
    return 1
  }

}

class C<T> : Java1<T>, Java2<T> where T : Number, T : Comparable<T> {
  constructor() /* primary */ {
    super/*Java1*/<T>()
    /* <init>() */

  }

}

class D<T> : Java1<T>, Java2<T> where T : Number, T : Comparable<T> {
  constructor() /* primary */ {
    super/*Java1*/<T>()
    /* <init>() */

  }

  override fun foo(t: T) {
  }

}

class E : Java1<Number>, Java3<Number> {
  constructor() /* primary */ {
    super/*Java1*/<Number>()
    /* <init>() */

  }

}

class F : Java1<Number>, Java3<Number> {
  constructor() /* primary */ {
    super/*Java1*/<Number>()
    /* <init>() */

  }

  override fun bar(): Number {
    return 2
  }

}

class G : Java1<Int>, KotlinInterface<Int> {
  constructor() /* primary */ {
    super/*Java1*/<Int>()
    /* <init>() */

  }

}

class H<T : Number?> : Java1<T>, KotlinInterface<T> {
  constructor() /* primary */ {
    super/*Java1*/<T>()
    /* <init>() */

  }

}

class I : Java1<Int>, KotlinInterface<Int> {
  constructor() /* primary */ {
    super/*Java1*/<Int>()
    /* <init>() */

  }

  override fun bar(): Int {
    return 3
  }

}

interface KotlinInterface<T : Any?> {
  abstract fun bar(): T?

  abstract fun foo(t: T)

}

fun test(a: A, b: B, c: C<Int>, d: D<Float>, e: E, f: F, g: G, h: H<Int?>, i: I) {
  a.foo(t = null)
  a.foo(t = 1)
  a.bar() /*~> Unit */
  b.foo(t = null)
  b.foo(t = 1)
  b.bar() /*~> Unit */
  c.foo(t = null)
  c.foo(t = 1)
  c.bar() /*~> Unit */
  d.foo(t = 1.1F)
  d.bar() /*~> Unit */
  e.foo(t = 1)
  e.bar() /*~> Unit */
  f.foo(t = 2.2)
  f.bar() /*~> Unit */
  g.foo(t = 2)
  g.bar() /*~> Unit */
  h.foo(t = null)
  h.bar() /*~> Unit */
  i.foo(t = null)
  i.bar() /*~> Unit */
}
