0

我尝试使用 kotlin 制作 MethodCall 类型判断函数,但它为我返回类型不匹配,我该如何解决?

import java.util.Objects

import io.flutter.plugin.common.MethodCall

class Utils private constructor() {
    companion object {
        fun getDoubleArgument(call: MethodCall, argument: String?): Double {
            return try {
                if (call.argument<Any>(argument) is Double) {
                    Objects.requireNonNull(call.argument<Double>(argument))!!  // The call.argument return Double? type, but when I add !! assert, it report Unnecessary non-null assertion (!!).
                } else if (call.argument<Any>(argument) is Long) {
                    val l = Objects.requireNonNull(call.argument<Long>(argument))
                    l!!.toDouble()
                } else if ...
        }
4

1 回答 1

1

我不使用 Flutter,所以请原谅任何错误。

Objects.requireNonNull()在 Kotlin 中不需要,因为!!它已经做了与 完全相同的事情requireNonNull(),只是它抛出 KotlinNullPointerException 而不是 NullPointerException。它不起作用的原因是 Kotlin 不知道 Java 方法保证返回非空值。

class Utils private constructor() {
    companion object {
        fun getDoubleArgument(call: MethodCall, argument: String?): Double {
            return try {
                if (call.argument<Any>(argument) is Double) {
                    call.argument<Double>(argument)!!
                } else if (call.argument<Any>(argument) is Long) {
                    call.argument<Long>(argument)!!.toDouble()
                } else if ...
        }

最好一次获得论点并使用该值。然后你可以依靠 Kotlin 智能转换来简化代码:

class Utils private constructor() {
    companion object {
        fun getDoubleArgument(call: MethodCall, argument: String?): Double {
            val arg = call.argument<Any>(argument)
            return try {
                if (arg is Double) {
                    arg
                } else if (arg is Long) {
                    arg.toDouble()
                } // ...
                else if (arg == null) {
                    0.0
                } else {
                    error("unsupported argument type")
                }
        }

您可以使用when语句而不是链else if来使其更易于阅读:

class Utils private constructor() {
    companion object {
        fun getDoubleArgument(call: MethodCall, argument: String?): Double {
            val arg = call.argument<Any>(argument)
            return try {
                when (arg) {
                    is Double -> arg
                    is Long -> arg.toDouble()
                    // ...
                    null -> 0.0
                    else -> error("unsupported argument type")
                }
            }
        }
于 2021-02-23T15:43:13.907 回答