Code-Apprentice
Code-Apprentice

Reputation: 83537

+ operator in Kotlin gives "Unresolved reference. None of the following candidates is applicable because of receiver type mismatch:"

I am learning Kotlin by doing exercises on exercism.com. I am currently working on triangles. The code has the following test that I'm trying to make pass:

class TriangleTest {
    @Test(expected = IllegalArgumentException::class)
    fun `triangle inequality violation - last is greater then sum of others `() {
        Triangle(1, 1, 3)
    }
}

My solution:

class Triangle<out T : Number>(private val a: T, private val b: T, private val c: T) {
    init {
        // ...

        if (a + b <= c) {
            throw IllegalArgumentException()
        }
    }
}

IntelliJ highlights the + red and gives the following error:

Unresolved reference. None of the following candidates is applicable because of receiver type mismatch:
public inline operator fun BigDecimal.plus(other: BigDecimal): BigDecimal defined in kotlin
public inline operator fun BigInteger.plus(other: BigInteger): BigInteger defined in kotlin
...

This goes on for like 100 lines with other plus() methods from array and collection types.

Why can't I add two numbers in the init block here?

Upvotes: 0

Views: 1020

Answers (1)

Arpit Shukla
Arpit Shukla

Reputation: 10493

This is because Kotlin does not provide a plus overload for adding two Numbers. One way is to convert the Numbers to Doubles add then perform operations on them. Also, Kotlin provides a handy require function for such validations.

class Triangle(val a: Number, val b: Number, val c: Number) {

    init {
        val (x, y, z) = listOf(a.toDouble(), b.toDouble(), c.toDouble())
        require(x + y > z)
    }
}

Upvotes: 1

Related Questions