Collections 什么';Iterable#all&;为什么Kotlin Char::class.java!=char.javaClass

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 有人能解释一下

我在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

有人能解释一下吗

编辑 对于@JBNizet
因为@JB Nizet已经告诉您如何分析问题

根据,Kotlin
Char
将映射到Java类型,并根据其声明进行决定

  • 当声明为不可为null的类型
    Char
    时,它是一个基本Java类型
    Char
  • 当声明为nullable类型
    Char?
    时,它是Java包装器类型
    字符
  • 当声明为类型参数时
    列表
    是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)
    ,您就会知道。
    harfler.all{println(it.javaClass)}
    required boolean不要用它替换闭包代码。在闭包中添加这一行,就在开头的大括号之后。我为@JBNizetJeez编辑了问题,这是非常基本的东西。在代码块中添加一行应该不是问题@纳特罗卢斯一点也不。很高兴它帮助了你,:)
    //                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
    }