Infix function with wildcard


#1

Hi, why is it that I can declare an infix function like this:

infix fun <T> T.shouldEqual(expected: T) {
    assertEquals(expected, this)
}

and then call it with incompatible types like that:

"mystring" shouldEqual 2

Thank you!


#2

kotlin tries to find common type for T which is Any which is ok for T (no bounds set)
infix is irrelevant you can test it for simple extension method
To test try to specify type explicitly like so

“asd”. shouldEqual(5)


#3

The position is also the same if you don’t have a receiver at all:

fun <T> shouldEqual(actual: T, expected: T) {
    assertEquals(expected, actual)
}

If you then call with:

shouldEqual("mystring", 2) 

the compiler again infers that T is Any, not String or Int.


#4

Ok, how can I set bounds T == T in this case? I only wants to compare String with String etc.


#5

You can effectively do that - at least for the basic types - by specifying that T should implement Comparable<T>:

infix fun <T: Comparable<T>> T.shouldEqual(expected: T) {
    assertEquals(expected, this)
}

The compiler will then determine that T can’t be Any because the latter doesn’t implement Comparable<Any> and so will produce an error.