// Generated from "j2kt/TypeWildCards.java"
@file:Suppress(
 "ALWAYS_NULL",
 "PARAMETER_NAME_CHANGED_ON_OVERRIDE",
 "SENSELESS_COMPARISON",
 "UNCHECKED_CAST",
 "UNNECESSARY_LATEINIT",
 "UNNECESSARY_NOT_NULL_ASSERTION",
 "UNREACHABLE_CODE",
 "UNUSED_ANONYMOUS_PARAMETER",
 "UNUSED_PARAMETER",
 "UNUSED_VARIABLE",
 "USELESS_CAST",
 "VARIABLE_IN_SINGLETON_WITHOUT_THREAD_LOCAL",
 "VARIABLE_WITH_REDUNDANT_INITIALIZER",
 "REDUNDANT_ELSE_IN_WHEN")

package j2kt

import javaemul.lang.*
import kotlin.Any
import kotlin.Suppress
import kotlin.jvm.JvmField
import kotlin.jvm.JvmStatic

open class TypeWildCards internal constructor() {
 companion object {
  @JvmStatic
  internal fun testSupplierWithUpperAndLowerBounds_pp_j2kt(supplier: SupplierWithUpperBound<in Child>) {
   val parent: Parent? = supplier.get() as Parent?
  }

  @JvmStatic
  internal fun testNullWithLowerBound_pp_j2kt(observer: Observer<in Child>) {
   observer.on(
    null as Child,
   )
  }

  @JvmStatic
  fun testObservable(observable: Observable<*>) {
   (observable as Observable<Any?>).addObserver(
    Observer { e: Any? ->
    },
   )
  }

  @JvmStatic
  fun <T: Observable<*>> testObservableParameterized(observable: T) {
   (observable as Observable<Any?>).addObserver(
    Observer { e: Any? ->
    },
   )
  }

  @JvmStatic
  fun testSuperWildcardObservable(observable: SuperWildcardObservable<*>) {
   (observable as SuperWildcardObservable<Any?>).addObserver(
    Observer { e: Any? ->
    },
   )
  }

  @JvmStatic
  fun testKtInObservable(observable: KtInObservable<*>) {
   (observable as KtInObservable<Any?>).addObserver(
    KtInObserver { e: Any? ->
    },
   )
  }

  @JvmStatic
  fun testRecursiveObservable(observable: RecursiveObservable<*>) {
   (observable as RecursiveObservable<RecursiveObservable<*>>).addObserver(
    Observer { e ->
    },
   )
  }
 }

 open class Parent internal constructor()

 open class Child internal constructor(): Parent()

 fun interface SupplierWithUpperBound<T: Parent> {
  fun get(): T
 }

 fun interface Observer<E> {
  fun on(event: E)
 }

 fun interface KtInObserver<in E> {
  fun on(event: E)
 }

 fun interface Observable<E> {
  fun addObserver(observer: Observer<E>)
 }

 fun interface SuperWildcardObservable<E> {
  fun addObserver(observer: Observer<in E?>)
 }

 fun interface KtInObservable<E> {
  fun addObserver(observer: KtInObserver<E>)
 }

 fun interface RecursiveObservable<E: RecursiveObservable<E>> {
  fun addObserver(observer: Observer<E>)
 }

 open class WithoutBounds internal constructor() {
  companion object {
   @JvmStatic
   fun testSetField(holder: Holder<*>) {
    (holder as Holder<Any?>).observer_pp_j2kt = Observer { e: Any? ->
    }
   }

   @JvmStatic
   fun testSetMethod(holder: Holder<*>) {
    (holder as Holder<Any?>).set_pp_j2kt(
     Observer { e: Any? ->
     },
    )
   }

   @JvmStatic
   fun testSetStaticMethod(holder: Holder<*>) {
    Holder.setStatic_pp_j2kt(
     holder,
     Observer { e: Any? ->
     },
    )
   }
  }

  fun interface Observer<E> {
   fun on(event: E)
  }

  open class Holder<E> internal constructor() {
   @JvmField
   internal var observer_pp_j2kt: Observer<E>? = null

   internal open fun set_pp_j2kt(observer: Observer<E>) {}

   companion object {
    @JvmStatic
    internal fun <E> setStatic_pp_j2kt(holder: Holder<E>, observer: Observer<E>) {}
   }
  }
 }

 open class WithBounds internal constructor() {
  companion object {
   @JvmStatic
   fun testSetField(holder: Holder<*>) {
    (holder as Holder<Event>).observer_pp_j2kt = Observer { e: Event ->
    }
   }

   @JvmStatic
   fun testSetMethod(holder: Holder<*>) {
    (holder as Holder<Event>).set_pp_j2kt(
     Observer { e: Event ->
     },
    )
   }

   @JvmStatic
   fun testSetStaticMethod(holder: Holder<*>) {
    Holder.setStatic_pp_j2kt(
     holder,
     Observer { e: Event ->
     },
    )
   }
  }

  interface Event

  fun interface Observer<E: Event> {
   fun on(event: E)
  }

  open class Holder<E: Event> internal constructor() {
   @JvmField
   internal var observer_pp_j2kt: Observer<E>? = null

   internal open fun set_pp_j2kt(observer: Observer<E>) {}

   companion object {
    @JvmStatic
    internal fun <E: Event> setStatic_pp_j2kt(holder: Holder<E>, observer: Observer<E>) {}
   }
  }
 }

 open class WithDependentBounds internal constructor() {
  companion object {
   @JvmStatic
   fun testSetField(holder: Holder<*, *>) {
    (holder as Holder<Event, Collection<Event>>).observer_pp_j2kt = Observer { e: Collection<out Event> ->
    }
   }

   @JvmStatic
   fun testSetMethod(holder: Holder<*, *>) {
    (holder as Holder<Event, Collection<Event>>).set_pp_j2kt(
     Observer { e: Collection<out Event> ->
     },
    )
   }

   @JvmStatic
   fun testSetStaticMethod(holder: Holder<*, *>) {
    Holder.setStatic_pp_j2kt(
     holder,
     Observer { e: Collection<out Event> ->
     },
    )
   }
  }

  interface Event

  interface Collection<V>

  fun interface Observer<E: Event, C: Collection<E>> {
   fun on(events: C)
  }

  open class Holder<E: Event, C: Collection<E>> internal constructor() {
   @JvmField
   internal var observer_pp_j2kt: Observer<E, C>? = null

   internal open fun set_pp_j2kt(observer: Observer<E, C>) {}

   companion object {
    @JvmStatic
    internal fun <E: Event, C: Collection<E>> setStatic_pp_j2kt(holder: Holder<E, C>, observer: Observer<E, C>) {}
   }
  }
 }
}
