val k = " asdfasdf "
fun test() {
if(k is String) {
// Do something
}
}
那么,如何通过函数调用传递该字符串? 例如:
fun test(xxxx) {
if(k is xxxx) {
// do something
}
}
答案 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)
有两种可能,具体取决于您的需求。
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
。
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")
}
}