// Ġ! USE _ EXPERIMENT AL : Ġkotlin . Experimental Std lib Api Ċ // ĠWITH _ REF LECT Ċ // ĠK JS _ WITH _ FULL _ RUNTIME Ċ Ċ package Ġtest Ċ Ċ import Ġkotlin . reflect . type Of Ċ import Ġkotlin . reflect . K Type Parameter Ċ import Ġkotlin . test . assertEquals Ċ Ċ class ĠContainer < T > Ċ Ċ fun Ġ< X , ĠY , ĠZ > Ġtest () Ġwhere ĠX Ġ: ĠY ?, ĠY Ġ: ĠList < Z >, ĠZ Ġ: ĠSet < String > ĊĠĠĠĠĠĠĠ Ġ= ĠtypeOf < Container < X >>() Ċ Ċ fun Ġbox (): ĠString Ġ{ ĊĠĠĠ Ġval Ġtype Ġ= Ġtest < Mutable List < Set < String >> ?, ĠMutable List < Set < String >>, ĠSet < String >>() ĊĠĠĠ Ġval Ġcontainer N ma e Ġ= ĠclassName (" test . Container ") ĊĠĠĠ ĠassertEquals ("$ container N ma e < X >", Ġtype . toString ()) ĊĊĠĠĠ Ġval Ġx Ġ= Ġtype . arguments . single (). type !!. classifier Ġas ĠK Type Parameter ĊĠĠĠ ĠassertEquals (" Y ?", Ġx . upper Bounds . join ToString ()) ĊĊĠĠĠ Ġval Ġy Ġ= Ġx . upper Bounds . single (). classifier Ġas ĠK Type Parameter ĊĠĠĠ Ġval Ġlist Name Ġ= ĠclassName (" kotlin . collections . List ") ĊĠĠĠ ĠassertEquals ("$ list Name < Z >", Ġy . upper Bounds . join ToString ()) ĊĊĠĠĠ Ġval Ġz Ġ= Ġy . upper Bounds . single (). arguments . single (). type !!. classifier Ġas ĠK Type Parameter ĊĠĠĠ Ġval ĠsetName Ġ= ĠclassName (" kotlin . collections . Set ") ĊĠĠĠ Ġval Ġstring Name Ġ= ĠclassName (" kotlin . String ") ĊĠĠĠ ĠassertEquals ("$ setName <$ string Name >", Ġz . upper Bounds . join ToString ()) ĊĊĠĠĠ Ġreturn Ġ" OK " Ċ } Ċ Ċ fun ĠclassName ( fq Name : ĠString ): ĠString Ġ{ ĊĠĠĠ Ġval Ġis JS Ġ= Ġ 1 Ġas ĠAny Ġis ĠDouble ĊĠĠĠ Ġreturn Ġif Ġ( is JS ) Ġfq Name . substring After Last ('.') Ġelse Ġfq Name Ċ } Ċ