如何在Kotlin中通过函数传递操作符参数

时间:2018-09-17 15:50:20

标签: kotlin

val k = " asdfasdf "
fun test() {
    if(k is String) {
     // Do something
    }
}

那么,如何通过函数调用传递该字符串? 例如:

fun test(xxxx) {
    if(k is xxxx) {
    // do something
    }
}

4 个答案:

答案 0 :(得分:2)

赞:

inline fun <reified T> testType(k: Any) {
   if(k is T) {
     println("is a ${T::class.simpleName}")
   } else {
     println("is not a ${T::class.simpleName}")
   }
}

这样称呼它:

test<String>("Hello") // is a String
test<String>(1) // is no String

Here进一步阅读。

答案 1 :(得分:2)

您可以使用谓词,例如:

fun testIt(predicate: (Any?) -> Boolean) {
  if (predicate(k)) {
    println("matches!")
  } else println("nope")
}

并按如下方式调用它:

testIt { it is String }
testIt { it is Int }

或者您可以使用归一化类型:

inline fun <reified T> testIt() {
  when (k) {
    is T -> println("matches!")
    else -> println("nope")
  }
}

并这样称呼它:

testIt<String>()
testIt<Int>()

为简单起见,我将您的当前变量保留在testIt-方法中……您可能需要重新设计;-)

我基本上假定一个成员变量如下:var k : Any? = null

答案 2 :(得分:2)

有两种可能,具体取决于您的需求。

1。使用inline和一个reified类型的参数

您可以在type参数上使用reified关键字,并结合使用inline函数:

inline fun <reified T> test(k: Any) {
    if (k is T) {
        println("k is a T!")
    }
}

See the documentation on reified

2。使用KClass<T>

如果您不想或无法执行功能inline,则可以使用KClass参数:

fun <T : Any> test(k: Any, type: KClass<T>) {
    if (type.isInstance(k)) {
        println("k is a T!")
    }
}

答案 3 :(得分:1)

inline fun <reified T> isType(obj: Any): Boolean {
    return obj is T
}

fun main(args: Array<String>) {
    val test = "This is a String"
    if (isType<String>(test)) {
        println("Success")
    } else {
        println("Failure")
    }
}