Collections 什么';Iterable#all&;为什么Kotlin Char::class.java!=char.javaClass
我在kotlin尝试一个例子,比如:Collections 什么';Iterable#all&;为什么Kotlin Char::class.java!=char.javaClass,collections,kotlin,typechecking,Collections,Kotlin,Typechecking,我在kotlin尝试一个例子,比如: fun test(){ val harfler = listOf("a","b",'c','d') println(harfler.all { it.javaClass == String::class.java || it.javaClass == Char::class.java }) } 列表包含Char或String但all函数在此表达式中返回false,为什么返回false 有人能解释一下
fun test(){
val harfler = listOf("a","b",'c','d')
println(harfler.all {
it.javaClass == String::class.java || it.javaClass == Char::class.java
})
}
列表包含Char
或String
但all
函数在此表达式中返回false
,为什么返回false
有人能解释一下吗
编辑
对于@JBNizet
因为@JB Nizet已经告诉您如何分析问题 根据,Kotlin
Char
将映射到Java类型,并根据其声明进行决定
- 当声明为不可为null的类型
时,它是一个基本Java类型Char
Char
- 当声明为nullable类型
时,它是Java包装器类型Char?
字符
- 当声明为类型参数时
是Java包装类型列表
字符
下面的示例进一步说明了不同,这就是我将数组类型声明为val it = 'a' // v--- it should be `Any` val array: Array<Any> = arrayOf('a') // v--- char println(it.javaClass) // v--- print [java.lang.Character] println(array.map { it.javaClass })
数组的原因,如下所示:
fun test() { val harfler = listOf("a", "b", 'c', 'd') // v---------------v--- use type checking here println(harfler.all { it is String || it is Char }) // print true }
如果您只是在闭包中添加了
,您就会知道。println(it.javaClass)
required boolean不要用它替换闭包代码。在闭包中添加这一行,就在开头的大括号之后。我为@JBNizetJeez编辑了问题,这是非常基本的东西。在代码块中添加一行应该不是问题@纳特罗卢斯一点也不。很高兴它帮助了你,:)harfler.all{println(it.javaClass)}
// v--- uses `java.lang.Character` instead val array: Array<Char> = arrayOf('a') // v--- java.lang.Character println(array.javaClass.componentType) // v--- [char] println(array.map { it.javaClass })
// v--- char println(Char::class.java) // v--- java.lang.Character println(Char::class.javaObjectType)
inline fun <T> Iterable<T>.all(predicate: (T) -> Boolean): Boolean { // return `false` immediately the condition didn't satisfied // v for (element in this) if (!predicate(element)) return false return true }
val anything: Array<Any> = arrayOf('a') val chars: Array<Char> = arrayOf('a') println(chars.all { it is Char }) // print true println(anything.all { it is Char }) // print true
fun test() { val harfler = listOf("a", "b", 'c', 'd') // v---------------v--- use type checking here println(harfler.all { it is String || it is Char }) // print true }