/* Ċ Ġ* ĠCopyright Ġ 2 0 1 8 - 2 0 1 9 Ġthe Ġoriginal Ġauthor Ġor Ġauthors . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġme . li u wj . kt orm . schema Ċ Ċ import Ġjava . lang . reflect . Parameterized Type Ċ import Ġjava . lang . reflect . Type Ċ import Ġkotlin . reflect . K Class Ċ import Ġkotlin . reflect . K Type Ċ import Ġkotlin . reflect . jvm . jvm Er asure Ċ Ċ /** Ċ Ġ* ĠBase Ġclass Ġused Ġto Ġobtain Ġfull Ġgeneric Ġtype Ġinformation Ġby Ġsubclass ing . Ċ Ġ*/ Ċ @ Suppress (" Un necessary Abstract Class ") Ċ abstract Ġclass ĠType Reference < T > Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġactual Ġtype Ġargument Ġof Ġsubclass Ġwithout Ġer ased . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġreferenced Type : ĠType Ġby Ġlazy Ġ{ Ġfind Super class Type Argument ( java Class ) Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġactual Ġkotlin Ġtype Ġargument Ġof Ġsubclass Ġwithout Ġer ased . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġreferenced Kotlin Type : ĠK Type Ġby Ġlazy Ġ{ Ġfind Super class Type Argument ( java Class . kotlin ) Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind Super class Type Argument ( cls : ĠClass < *> ): ĠType Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġgeneric Super class Ġ= Ġcls . generic Super class ĊĊĠĠĠĠĠĠĠ Ġif Ġ( generic Super class Ġis ĠClass <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( generic Super class Ġ!= ĠType Reference :: class . java ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTry Ġto Ġcli mb Ġup Ġthe Ġhierarchy Ġuntil Ġmeet Ġsomething Ġuseful . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfind Super class Type Argument ( generic Super class . super class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Could Ġnot Ġfind Ġthe Ġreferenced Ġtype Ġof Ġclass Ġ$ java Class ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġ( generic Super class Ġas ĠParameter ized Type ). actual Type Arguments [ 0 ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind Super class Type Argument ( cls : ĠK Class < *> ): ĠK Type Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsup ertype Ġ= Ġcls . sup ert ypes . first Ġ{ Ġ! it . jvm Er asure . java . is Interface Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( sup ertype . arguments . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sup ertype . jvm Er asure Ġ!= ĠType Reference :: class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTry Ġto Ġcli mb Ġup Ġthe Ġhierarchy Ġuntil Ġmeet Ġsomething Ġuseful . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfind Super class Type Argument ( sup ertype . jvm Er asure ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Could Ġnot Ġfind Ġthe Ġreferenced Ġtype Ġof Ġclass Ġ$ java Class ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsup ertype . arguments [ 0 ]. type !! ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠCreate Ġa Ġ[ Type Reference ] Ġobject Ġwhich Ġreferences Ġthe Ġre ified Ġtype Ġargument Ġ[ T ]. Ċ Ġ*/ Ċ inline Ġfun Ġ< re ified ĠT > Ġtype Ref (): ĠType Reference < T > Ġ{ ĊĠĠĠ Ġreturn Ġobject Ġ: ĠType Reference < T >() Ġ{ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠObtain Ġthe Ġfull Ġgeneric Ġtype Ġinformation Ġof Ġthe Ġre ified Ġtype Ġargument Ġ[ T ], Ġusage : Ġ` type Of < List < String >> ()`. Ċ Ġ*/ Ċ inline Ġfun Ġ< re ified ĠT > ĠtypeOf (): ĠType Ġ{ ĊĠĠĠ Ġreturn Ġtype Ref < T >(). referenced Type Ċ } Ċ Ċ /** Ċ Ġ* ĠObtain Ġthe Ġfull Ġkotlin Ġgeneric Ġtype Ġinformation Ġof Ġthe Ġre ified Ġtype Ġargument Ġ[ T ], Ċ Ġ* Ġusage : Ġ` kotlin TypeOf < List < String >> ()`. Ċ Ġ* Ċ Ġ* ĠNote : ĠDo Ġnot Ġuse Ġthis Ġfunction Ġuntil Ġthe Ġbug Ġ[ KT - 2 8 6 1 6 ]( https :// yout rack . jetbrains . com / issue / KT - 2 8 6 1 6 ) Ġfixed . Ċ Ġ*/ Ċ @ Deprecated (" Do Ġnot Ġuse Ġthis Ġfunction Ġuntil Ġthe Ġbug ĠK T - 2 8 6 1 6 Ġfixed ", Ġlevel Ġ= ĠDeprec ation Level . HIDDEN ) Ċ inline Ġfun Ġ< re ified ĠT > Ġkotlin TypeOf (): ĠK Type Ġ{ ĊĠĠĠ Ġreturn Ġtype Ref < T >(). referenced Kotlin Type Ċ } Ċ