Home > Net >  Kotlin generics with subtypes?
Kotlin generics with subtypes?

Time:03-19

I can't wrap my head around why arent subtypes working with Kotlin generics.

Assume the following simple scenario

class Student : Person()
open class Person

This works

fun personOrStudent : Person{
return Student()
}

But this doesnt

fun <Item:Person> personOrStudent() : Item {
return Student()
}

I dont understand why. Isn't the return type Item , typed as a subtype of Person ? . I believe the syntax clearly communicates that Item would be a subtype of Person .

But I get a compile time error saying expected was Person , not a student.

Does this have something to do with covariance / contravariance?

CodePudding user response:

By defining a function as parameterized we basically mean that we don't know the exact type of Item and that it depends on the call site. Student may be a valid return value from this function, but it may be not.

Consider this example:

class NotAStudent : Person()

personOrStudent<NotAStudent>()

We expect that the function returns NotAStudent, but implementation returned Student. This is why it can't compile.

In other words: <Item: Person> doesn't mean that Item is just any Person. It means Item is a very specific subtype of Person, but we don't know which one.

  • Related