Sangeet Suresh
Sangeet Suresh

Reputation: 2545

Kotlin Function Generics - Upper Bound Not Working

I faced some issue regarding usage of Kotlin generics in functions

fun <T : CharSequence> doSomething(): T {
     return String() as T
}

class Something(intValue: Int)

Something(doSomething()) // Doesn't show any compile error 

Now when it is executed it throws error

java.lang.ClassCastException: class java.lang.String cannot be cast to class java.lang.Number

Wanted to know why Kotlin compiler is not throwing error for incompatible typecasting

Upvotes: 2

Views: 257

Answers (1)

Sweeper
Sweeper

Reputation: 271625

I think what you are seeing is the major compiler bug KT-47664. Though in the bug report they used a much more complex example to demonstrate the issue, the cause of the bug is the same, that being the compiler has inferred an empty intersection type (the intersection of CharSequence and Int is empty) as the type parameter.

The algorithm apparently treats an empty intersection type the same as any other type, doesn't think anything special of it, and so type inference succeeds.

This bug has been fixed by KT-51221 Deprecate inferring type variables into an empty intersection type. From what I understand from reading the reports, there will now be a warning if an empty intersection type is inferred. However, the fix is only included in Kotlin 1.7.20+, which at the time of writing, is not released yet :(

Upvotes: 2

Related Questions