Kotlin编译错误:不能使用提供的参数调用以下函数

zdwk9cvp  于 2023-02-09  发布在  Kotlin
关注(0)|答案(5)|浏览(195)

我有一个类,它的构造函数有2个int参数(允许空值)。

None of the following functions can be called with the arguments supplied: 
public final operator fun plus(other: Byte): Int defined in kotlin.Int
public final operator fun plus(other: Double): Double defined in kotlin.Int
public final operator fun plus(other: Float): Float defined in kotlin.Int
public final operator fun plus(other: Int): Int defined in kotlin.Int
public final operator fun plus(other: Long): Long defined in kotlin.Int
public final operator fun plus(other: Short): Int defined in kotlin.Int

下面是NumberAdder类。

class NumberAdder (num1 : Int?, num2 : Int?) {

    var first : Int? = null
    var second : Int? = null

    init{
    first = num1
    second = num2
    }

fun add() : Int?{

    if(first != null && second != null){
        return first + second
    }

    if(first == null){
        return second
    }

    if(second == null){
        return first
    }

    return null
}

}

怎么解决这个问题呢?如果两个都是空的,我想返回空,如果一个是空的,返回另一个,否则返回和。

vfwfrxfs

vfwfrxfs1#

因为firstsecond是变量,所以在执行if测试时,它们不会被智能转换为非空类型。理论上,在if测试之后和+之前,这些值可以由另一个线程更改。要解决此问题,可以在执行if测试之前将它们分配给局部变量。

fun add() : Int? {
    val f = first
    val s = second

    if (f != null && s != null) {
        return f + s
    }

    if (f == null) {
        return s
    }

    if (s == null) {
        return f
    }

    return null
}
nr7wwzry

nr7wwzry2#

最简单的代码修复方法是使用val而不是var

class NumberAdder (num1 : Int?, num2 : Int?) {

    val first : Int?
    val second : Int?

    init{
        first = num1
        second = num2
    }
...

我在这里使用了Kotlin允许在构造函数中赋值val

ig9co6j1

ig9co6j13#

我在使用assertEquals时遇到过类似的问题。
我的准则是

assertEquals(
       expeted = 42, // notice the missing c 
       actual = foo()
)

在我修复了这个拼写错误之后,我的IDE说我不能在非Kotlin函数中使用命名参数,所以我将值提取到变量中,一切都开始正常工作。

val expected = 42
 val actual = foo()
 assertEquals(expected, actual)
u91tlkcl

u91tlkcl4#

这似乎也起作用。

fun main(args: Array<String>) {

    var numberAdder : NumberAdder = NumberAdder(10, 20)
    var result : Int? = numberAdder.add()
    println("$result")
}

class NumberAdder (num1 : Int?, num2 : Int?) {

    var first : Int?
    var second : Int?

    init{
        first = num1
        second = num2
    }

fun add() : Int?{

    if(first != null && second != null){
        return first as Int + second as Int
    }

    if(first == null){
        return second
    }

    if(second == null){
        return first
    }

    return null
}

}
bjp0bcyl

bjp0bcyl5#

class NumberAdder (num1 : Int?, num2 : Int?) {

var first : Int? = null
var second : Int? = null

init{
    first = num1
    second = num2
}

fun add() : Int?{

    if(first != null && second != null){
        **return first!!.toInt() + second!!.toInt()**

    }

    if(first == null){
        return second
    }

    if(second == null){
        return first
    }

    return null
}

}

  • 这是工作,但我不知道?

相关问题