package Ġnet . cord a . serialization . internal . model Ċ Ċ import Ġcom . google . common . reflect . Type Token Ċ import Ġnet . cord a . serialization . internal . amqp . as Class Ċ import Ġjava . io . Not Serializable Exception Ċ import Ġjava . lang . reflect .* Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠThrow n Ġif Ġa Ġ[ Type Identifier ] Ġis Ġincompatible Ġwith Ġthe Ġlocal Ġ[ Type ] Ġto Ġwhich Ġit Ġrefers , Ċ Ġ* Ġi . e . Ġif Ġthe Ġnumber Ġof Ġtype Ġparameters Ġdoes Ġnot Ġmatch . Ċ Ġ*/ Ċ class ĠIn compatible Type Identifier Exception ( message : ĠString ) Ġ: ĠNot Serializable Exception ( message ) Ċ Ċ /** Ċ Ġ* ĠUsed Ġas Ġa Ġkey Ġfor Ġretrieving Ġcached Ġtype Ġinformation . ĠWe Ġneed Ġslightly Ġmore Ġinformation Ġthan Ġthe Ġbare Ġclassname , Ċ Ġ* Ġand Ġslightly Ġless Ġinformation Ġthan Ġis Ġcaptured Ġby ĠJava 's Ġ[ Type ] Ġ( We Ġdrop Ġtype Ġvariance Ġbecause Ġin Ġpractice Ġwe Ġresolve Ċ Ġ* Ġwild cards Ġto Ġtheir Ġupper Ġbounds , Ġe . g . Ġ` ? Ġextends ĠFoo ` Ġto Ġ` Foo `). ĠWe Ġalso Ġneed Ġan Ġidentifier Ġwe Ġcan Ġuse Ġeven Ġwhen Ġthe Ċ Ġ* Ġidentified Ġtype Ġis Ġnot Ġvisible Ġfrom Ġthe Ġcurrent Ġclass loader . Ċ Ġ* Ċ Ġ* ĠThese Ġidentifiers Ġact Ġas Ġthe Ġanchor Ġfor Ġcomparison Ġbetween Ġremote Ġtype Ġinformation Ġ( prior Ġto Ġmatching Ġit Ġto Ġan Ġactual Ċ Ġ* Ġlocal Ġclass ) Ġand Ġlocal Ġtype Ġinformation . Ċ Ġ* Ċ Ġ* Ġ[ Type Identifier ] Ġprovides Ġa Ġfamily Ġof Ġtype Ġidentifiers , Ġtogether Ġwith Ġa Ġ[ pretty Print ] Ġmethod Ġfor Ġdisplaying Ġthem . Ċ Ġ*/ Ċ sealed Ġclass ĠType Identifier Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġname Ġof Ġthe Ġtype . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġval Ġname : ĠString ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠObtain Ġthe Ġlocal Ġtype Ġmatching Ġthis Ġidentifier ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġclass Loader ĠThe Ġclass loader Ġto Ġuse Ġto Ġload Ġthe Ġtype . ĊĠĠĠĠ Ġ* Ġ@ throws ĠClass NotFoundException Ġif Ġthe Ġtype Ġor Ġany Ġof Ġits Ġparameters Ġcannot Ġbe Ġloaded . ĊĠĠĠĠ Ġ* Ġ@ throws ĠIn compatible Type Identifier Exception Ġif Ġthe Ġtype Ġidentifier Ġis Ġincompatible Ġwith Ġthe Ġlocally - defined Ġtype ĊĠĠĠĠ Ġ* Ġto Ġwhich Ġit Ġrefers . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġfun Ġget Local Type ( class Loader : ĠClassLoader Ġ= ĠClassLoader . getSystem ClassLoader ()): ĠType ĊĊĠĠĠ Ġopen Ġval Ġer ased : ĠType Identifier Ġget () Ġ= Ġthis ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠObtain Ġa Ġnicely - formatted Ġrepresentation Ġof Ġthe Ġidentified Ġtype , Ġfor Ġhelp Ġwith Ġdebugging . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġpretty Print ( simplify ClassNames : ĠBoolean Ġ= Ġtrue ): ĠString Ġ= Ġwhen ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠType Identifier . Unknown Type Ġ-> Ġ" ?" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠType Identifier . Top Type Ġ-> Ġ"*" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠType Identifier . Un parameter ised Ġ-> Ġname . simplify ClassName If Required ( simplify ClassNames ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠType Identifier . Erase d Ġ-> Ġ"${ name . simplify ClassName If Required ( simplify ClassNames )} Ġ( er ased )" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠType Identifier . ArrayOf Ġ-> Ġ"${ component Type . pretty Print ( simplify ClassNames )} []" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠType Identifier . Parameter ised Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname . simplify ClassName If Required ( simplify ClassNames ) Ġ+ Ġparameters . join ToString (", Ġ", Ġ"< ", Ġ"> ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . pretty Print ( simplify ClassNames ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠString . simplify ClassName If Required ( simplify ClassNames : ĠBoolean ): ĠString Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( simplify ClassNames ) Ġsplit (".", Ġ"$ "). last () Ġelse Ġthis ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠObtain Ġthe Ġ[ Type Identifier ] Ġfor Ġan Ġer ased ĠJava Ġclass . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġtype ĠThe Ġclass Ġto Ġget Ġa Ġ[ Type Identifier ] Ġfor . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġfor Class ( type : ĠClass < *> ): ĠType Identifier Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype . name Ġ== Ġ" java . lang . Object " Ġ-> ĠTop Type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype . isArray Ġ-> ĠArray Of ( for Class ( type . component Type )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype . type Parameters . isEmpty () Ġ-> ĠUn parameter ised ( type . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠE rase d ( type . name , Ġtype . type Parameters . size ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠObtain Ġthe Ġ[ Type Identifier ] Ġfor Ġa ĠJava Ġ[ Type ] Ġ( typ ically Ġobtained Ġby Ġcalling Ġone Ġof ĊĠĠĠĠĠĠĠĠ Ġ* Ġ[ java . lang . reflect . Parameter . get Annotated Type ], ĊĠĠĠĠĠĠĠĠ Ġ* Ġ[ java . lang . reflect . Field . get GenericType ] Ġor ĊĠĠĠĠĠĠĠĠ Ġ* Ġ[ java . lang . reflect . Method . get Generic ReturnType ]). ĠW ildcard Ġtypes Ġand Ġtype Ġvariables Ġare Ġconverted Ġto Ġ[ Unknown ]. ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġtype ĠThe Ġ[ Type ] Ġto Ġobtain Ġa Ġ[ Type Identifier ] Ġfor . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġresolution Context ĠOptionally , Ġa Ġ[ Type ] Ġwhich Ġcan Ġbe Ġused Ġto Ġresolve Ġtype Ġvariables , Ġfor Ġexample Ġa ĊĠĠĠĠĠĠĠĠ Ġ* Ġclass Ġimplementing Ġa Ġparameter ised Ġinterface Ġand Ġspecifying Ġvalues Ġfor Ġtype Ġvariables Ġwhich Ġare Ġreferred Ġto ĊĠĠĠĠĠĠĠĠ Ġ* Ġby Ġmethods Ġdefined Ġin Ġthe Ġinterface . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġfor GenericType ( type : ĠType , Ġresolution Context : ĠType Ġ= Ġtype ): ĠType Identifier Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠParameter ized Type Ġ-> ĠParameter ised ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( type . raw Type Ġas ĠClass < *> ). name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype . owner Type ?. let Ġ{ Ġfor GenericType ( it ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype . actual Type Arguments . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresolved Ġ= Ġit . resolve Again st ( resolution Context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAvoid Ġcycles , Ġe . g . ĠEnum < E > Ġwhere ĠE Ġresolves Ġto ĠEnum < E > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( resolved Ġ== Ġtype ) ĠUnknown Type Ġelse Ġfor GenericType ( resolved ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠClass < *> Ġ-> Ġfor Class ( type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠGeneric ArrayType Ġ-> ĠArray Of ( for GenericType ( type . generic ComponentType . resolve Again st ( resolution Context ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠW ildcard Type Ġ-> Ġtype . upper Bound . let Ġ{ Ġif Ġ( it Ġ== Ġtype ) ĠUnknown Type Ġelse Ġfor GenericType ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠUnknown Type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġ[ Type Identifier ] Ġof Ġ[ Any ] Ġ/ Ġ[ java . lang . Object ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġobject ĠTop Type Ġ: ĠType Identifier () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġname Ġget () Ġ= Ġ"*" ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Local Type ( class Loader : ĠClassLoader ): ĠType Ġ= ĠAny :: class . java ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ" Top Type " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġobject ĠUn bounded Wildcard Type Ġ: ĠW ildcard Type Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Lower Bounds (): ĠArray < Type > Ġ= Ġempty Array () ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Upper Bounds (): ĠArray < Type > Ġ= ĠarrayOf ( Any :: class . java ) ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ" ?" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġ[ Type Identifier ] Ġof Ġan Ġun bounded Ġwildcard . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġobject ĠUnknown Type Ġ: ĠType Identifier () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġname Ġget () Ġ= Ġ" ?" ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Local Type ( class Loader : ĠClassLoader ): ĠType Ġ= ĠUn bounded Wildcard Type ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ" Unknown Type " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIdent ifies Ġa Ġclass Ġwith Ġno Ġtype Ġparameters . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġdata Ġclass ĠUn parameter ised ( override Ġval Ġname : ĠString ) Ġ: ĠType Identifier () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġprimitives Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠByte :: class , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBoolean :: Ġclass , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠChar :: class , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInt :: class , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠShort :: class , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLong :: class , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFloat :: class , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDouble :: class ). associate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . java Primitive Type !!. name Ġto Ġit . java Primitive Type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ" Un parameter ised ($ name )" ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Local Type ( class Loader : ĠClassLoader ): ĠType Ġ= Ġprimitives [ name ] Ġ?: Ġclass Loader . load Class ( name ) ĊĊĠĠĠĠĠĠĠ Ġval Ġis Primitive Ġget () Ġ= Ġname Ġin Ġprimitives ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIdent ifies Ġa Ġparameter ised Ġclass Ġsuch Ġas ĠList < Int >, Ġfor Ġwhich Ġwe Ġcannot Ġobtain Ġthe Ġtype Ġparameters Ġat Ġruntime ĊĠĠĠĠ Ġ* Ġbecause Ġthey Ġhave Ġbeen Ġer ased . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġdata Ġclass ĠE rase d ( override Ġval Ġname : ĠString , Ġval Ġer ased Parameter Count : ĠInt ) Ġ: ĠType Identifier () Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġto Parameterized ( parameters : ĠList < Type Identifier >): ĠType Identifier Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parameters . size Ġ!= Ġer ased Parameter Count ) Ġthrow ĠIn compatible Type Identifier Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Erase d Ġtype Ġ$ name Ġtakes Ġ$ er ased Parameter Count Ġparameters , Ġbut Ġ${ parameters . size } Ġsupplied " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠParameter ised ( name , Ġnull , Ġparameters ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ" Erase d ($ name )" ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Local Type ( class Loader : ĠClassLoader ): ĠType Ġ= Ġclass Loader . load Class ( name ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠRe const it uted Generic ArrayType ( private Ġval Ġcomponent Type : ĠType ) Ġ: ĠGeneric ArrayType Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Generic ComponentType (): ĠType Ġ= Ġcomponent Type ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ"$ component Type []" ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġother Ġis ĠGeneric ArrayType Ġ&& Ġcomponent Type Ġ== Ġother . generic ComponentType ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ= ĠObjects . hashCode ( component Type ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIdent ifies Ġa Ġtype Ġwhich Ġis Ġan Ġarray Ġof Ġsome Ġother Ġtype . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcomponent Type ĠThe Ġ[ Type Identifier ] Ġof Ġthe Ġcomponent Ġtype Ġof Ġthis Ġarray . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġdata Ġclass ĠArray Of ( val Ġcomponent Type : ĠType Identifier ) Ġ: ĠType Identifier () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġname Ġget () Ġ= Ġcomponent Type . name Ġ+ Ġ" []" ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ" ArrayOf (${ component Type . pretty Print () })" ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Local Type ( class Loader : ĠClassLoader ): ĠType Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomponent Ġ= Ġcomponent Type . getLocal Type ( class Loader ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( component Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠParameter ised Ġ-> ĠRe const it uted Generic ArrayType ( component ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġjava . lang . reflect . Array . newInstance ( component . as Class (), Ġ 0 ). java Class ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠRe const it uted Parameterized Type ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġ_ raw Type : ĠType , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġ_ owner Type : ĠType ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġ_ actual Type Arguments : ĠArray < Type >) Ġ: ĠParameter ized Type Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Raw Type (): ĠType Ġ= Ġ_ raw Type ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Owner Type (): ĠType ? Ġ= Ġ_ owner Type ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Actual Type Arguments (): ĠArray < Type > Ġ= Ġ_ actual Type Arguments ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= ĠType Identifier . for GenericType ( this ). pretty Print ( false ) ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġother Ġis ĠParameter ized Type Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġother . raw Type Ġ== Ġraw Type Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġother . owner Type Ġ== Ġowner Type Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠArrays . equals ( other . actual Type Arguments , Ġactual Type Arguments ) ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠArrays . hashCode ( actual Type Arguments ) Ġxor ĠObjects . hashCode ( owner Type ) Ġxor ĠObjects . hashCode ( raw Type ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġparameter ised Ġclass Ġsuch Ġas ĠMap < String , ĠString > Ġfor Ġwhich Ġwe Ġhave Ġresolved Ġtype Ġparameter Ġvalues . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġparameters Ġ[ Type Identifier ] s Ġfor Ġeach Ġof Ġthe Ġresolved Ġtype Ġparameter Ġvalues Ġof Ġthis Ġtype . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġdata Ġclass ĠParameter ised ( override Ġval Ġname : ĠString , Ġval Ġowner : ĠType Identifier ?, Ġval Ġparameters : ĠList < Type Identifier >) Ġ: ĠType Identifier () Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠGet Ġthe Ġtype - er ased Ġequivalent Ġof Ġthis Ġtype . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġer ased : ĠType Identifier Ġget () Ġ= ĠE rase d ( name , Ġparameters . size ) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ" Parameter ised (${ pretty Print () })" ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Local Type ( class Loader : ĠClassLoader ): ĠType Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġraw Type Ġ= Ġclass Loader . load Class ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( raw Type . type Parameters . size Ġ!= Ġparameters . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIn compatible Type Identifier Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Class Ġ$ raw Type Ġexpects Ġ${ raw Type . type Parameters . size } Ġtype Ġarguments , Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" but Ġtype Ġ${ this . pretty Print ( false )} Ġhas Ġ${ parameters . size }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠRe const it uted Parameterized Type ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġraw Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġowner ?. getLocal Type ( class Loader ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameters . map Ġ{ Ġit . getLocal Type ( class Loader ) Ġ}. to Typed Array ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġfun ĠType . resolve Again st ( context : ĠType ): ĠType Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠ Ġis ĠW ildcard Type Ġ-> Ġthis . upper Bound ĊĠĠĠ Ġis ĠParameter ized Type , ĊĠĠĠ Ġis ĠType Variable < *> Ġ-> ĠType Token . of ( context ). resolve Type ( this ). type . upper Bound ĊĠĠĠ Ġelse Ġ-> Ġthis Ċ } Ċ Ċ private Ġval ĠType . upper Bound : ĠType ĊĠĠĠ Ġget () Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠType Variable < *> Ġ-> Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . bounds . isEmpty () Ġ|| Ġthis . bounds . size Ġ> Ġ 1 Ġ-> Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthis . bounds [ 0 ] ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠW ildcard Type Ġ-> Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . upper Bounds . isEmpty () Ġ|| Ġthis . upper Bounds . size Ġ> Ġ 1 Ġ-> Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthis . upper Bounds [ 0 ] ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthis ĊĠĠĠ Ġ}