// Ġ! DIAG NO ST ICS : Ġ- USE LESS _ CAST Ġ- UNUSED _ PARAMETER Ġ- UNUSED _ VARIABLE Ċ // Ġ! WITH _ NEW _ IN FER ENCE Ċ Ċ // ĠFILE : Ġj / Base . java Ċ package Ġj ; Ċ public Ġinterface ĠBase Ġ{ ĊĠĠĠ Ġvoid Ġfoo (); Ċ } Ċ Ċ // ĠFILE : Ġj / Impl . java Ċ package Ġj ; Ċ Ċ /* Ġpackage Ġ*/ Ġabstract Ġclass ĠImp l Ġimplements ĠBase Ġ{ ĊĠĠĠ Ġpublic Ġvoid Ġfoo () Ġ{} Ċ } Ċ Ċ // ĠFILE : Ġj / Derived 1 . java Ċ package Ġj ; Ċ Ċ public Ġclass ĠDerived 1 Ġextends ĠImp l Ġ{} Ċ Ċ // ĠFILE : Ġj / Derived 2 . java Ċ package Ġj ; Ċ Ċ public Ġclass ĠDerived 2 Ġextends ĠImp l Ġ{} Ċ Ċ // ĠFILE : Ġk / Client . kt Ċ package Ġk Ċ Ċ import Ġj .* Ċ Ċ val Ġd 1 Ġ= ĠDerived 1 () Ċ val Ġd 2 Ġ= ĠDerived 2 () Ċ Ċ fun Ġ< T > Ġselect ( x 1 : ĠT , Ġx 2 : ĠT ) Ġ= Ġx 1 Ċ fun Ġ< T > Ġselect n ( var arg Ġxx : ĠT ) Ġ= Ġxx [ 0 ] Ċ fun Ġ< T Ġ: ĠBase > Ġfoo ( x : ĠT ) Ġ= Ġx . foo () Ċ fun Ġ< T > ĠlistOf 2 ( x 1 : ĠT , Ġx 2 : ĠT ): ĠList < T > Ġ= Ġnull !! Ċ fun Ġ< T > ĠarrayOf 2 ( x 1 : ĠT , Ġx 2 : ĠT ): ĠArray < T > Ġ= Ġnull !! Ċ Ċ fun Ġtest () Ġ{ ĊĠĠĠ Ġval Ġtest 1 : ĠBase Ġ= Ġ<! NI ; IN ACC ES SI BLE _ TYPE !> if Ġ( true ) Ġd 1 Ġelse Ġd 2 <! > ĊĊĠĠĠ Ġval Ġtest 2 Ġ= Ġ<! IN ACC ES SI BLE _ TYPE !> if Ġ( true ) Ġd 1 Ġelse Ġd 2 <! > ĊĊĠĠĠ Ġval Ġtest 3 Ġ= Ġ<! IN ACC ES SI BLE _ TYPE !> when Ġ{ ĊĠĠĠĠĠĠĠ Ġtrue Ġ-> Ġd 1 ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġd 2 ĊĠĠĠ Ġ} <! > ĊĊĠĠĠ Ġval Ġtest 4 : ĠBase Ġ= Ġ<! NI ; IN ACC ES SI BLE _ TYPE !> when Ġ{ ĊĠĠĠĠĠĠĠ Ġtrue Ġ-> Ġd 1 ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġd 2 ĊĠĠĠ Ġ} <! > ĊĊĠĠĠ Ġval Ġtest 5 Ġ= Ġ<! IN ACC ES SI BLE _ TYPE !> select ( d 1 , Ġd 2 ) <! > ĊĊĠĠĠ Ġval Ġtest 6 Ġ= Ġselect < Base >( d 1 , Ġd 2 ) ĊĊĠĠĠ Ġval Ġtest 7 Ġ= Ġselect ( d 1 Ġas ĠBase , Ġd 2 ) ĊĊĠĠĠ Ġval Ġtest 8 Ġ= Ġ<! IN ACC ES SI BLE _ TYPE !> select n ( d 1 , Ġd 2 ) <! > ĊĊĠĠĠ Ġval Ġtest 9 Ġ= Ġselect n < Base >( d 1 , Ġd 2 ) ĊĊĠĠĠ Ġval Ġtest 1 0 Ġ= Ġ<! IN ACC ES SI BLE _ TYPE !> listOf 2 ( d 1 , Ġd 2 ) <! > ĊĊĠĠĠ Ġval Ġtest 1 1 : ĠList < Base > Ġ= Ġ<! IN ACC ES SI BLE _ TYPE !> listOf 2 ( d 1 , Ġd 2 ) <! > ĊĠĠĠ Ġ// ĠNB ĠIn ferred Ġtype Ġis ĠList < Impl > Ġbecause ĠList Ġis Ġco variant . ĊĊĠĠĠ Ġval Ġtest 1 2 Ġ= ĠlistOf 2 < Base >( d 1 , Ġd 2 ) ĊĊĠĠĠ Ġval Ġtest 1 3 Ġ= Ġ<! IN ACC ES SI BLE _ TYPE !> array Of 2 ( d 1 , Ġd 2 ) <! > ĊĊĠĠĠ Ġval Ġtest 1 4 : ĠArray < Base > Ġ= ĠarrayOf 2 ( d 1 , Ġd 2 ) ĊĠĠĠ Ġ// ĠNB ĠIn ferred Ġtype Ġis ĠArray < Base > Ġbecause ĠArray Ġis Ġinvariant . ĊĊĠĠĠ Ġval Ġtest 1 5 Ġ= ĠarrayOf 2 < Base >( d 1 , Ġd 2 ) ĊĊĠĠĠ Ġfor Ġ( test 1 6 Ġin Ġ<! IN ACC ES SI BLE _ TYPE !> listOf 2 ( d 1 , Ġd 2 ) <! >) Ġ{} Ċ } Ċ Ċ fun Ġtest Ok In Java () Ġ{ ĊĠĠĠ Ġ// ĠThe Ġfollowing Ġis ĠOk Ġin ĠJava , Ġbut Ġis Ġan Ġerror Ġin ĠKotlin . ĊĠĠĠ Ġ// ĠTODO Ġdo Ġnot Ġgenerate Ġun needed ĠCHECK CAST s . ĊĠĠĠ Ġ// ĠTODO Ġdo Ġnot Ġreport ĠIN ACC ES SI BLE _ TYPE Ġfor Ġcorresponding Ġcases . ĊĠĠĠ Ġ<! IN ACC ES SI BLE _ TYPE !> select ( d 1 , Ġd 2 ) <! > ĊĠĠĠ Ġfoo ( <! IN ACC ES SI BLE _ TYPE !> select ( d 1 , Ġd 2 ) <! >) Ċ } Ċ