/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 2 0 ĠJetBrains Ġs . r . o . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ċ Ġ* Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ Ġ*/ Ċ Ċ package Ġkt 3 5 9 4 0 Ċ Ċ import Ġkotlin . reflect .* Ċ Ċ @ Opt In ( Experimental Associated Objects :: class ) Ċ @ Associated Object Key Ċ @ Retention ( Annotation Retention . BINARY ) Ċ annotation Ġclass ĠAssoci ated ( val Ġk Class : ĠK Class <* >) Ċ Ċ private Ġinterface ĠI 1 Ġ{ ĊĠĠĠ Ġval Ġs : ĠString Ċ } Ċ Ċ private Ġclass ĠI 1 Impl Ġ: ĠI 1 Ġ{ ĊĠĠĠ Ġoverride Ġval Ġs Ġ= Ġ" zz z " Ċ } Ċ Ċ private Ġclass ĠC ( var Ġi 1 : ĠI 1 ?) Ċ Ċ private Ġinterface ĠI 2 Ġ{ ĊĠĠĠ Ġfun Ġbar ( c : ĠC ) Ċ } Ċ Ċ private Ġobject ĠI 2 Impl Ġ: ĠI 2 Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġbar ( c : ĠC ) Ġ{ ĊĠĠĠĠĠĠĠ Ġc . i 1 Ġ= ĠI 1 Impl () ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Associated ( I 2 Impl :: class ) Ċ private Ġclass ĠI 2 Impl Holder Ċ Ċ @ Opt In ( Experimental Associated Objects :: class ) Ċ fun Ġtest Kt 3 5 9 4 0 (): ĠString Ġ{ ĊĠĠĠ Ġval Ġi 2 Ġ= ĠI 2 Impl Holder :: class . find Associated Object < Associated >() !! Ġas ĠI 2 ĊĠĠĠ Ġval Ġc Ġ= ĠC ( null ) ĊĠĠĠ Ġi 2 . bar ( c ) ĊĠĠĠ Ġreturn Ġc . i 1 !!. s Ċ } Ċ