Scala 对非参数函数参数和结果进行装箱和拆箱。为什么?可能重复

Scala is boxing and unboxing non parametric function arguments and result. Why? Posible duplicate

根据调试器,在以下代码片段中,scala 对 Char 参数进行装箱和拆箱,随后对 Boolean 结果进行装箱和拆箱。为什么?如何避免这种情况?

object Test{
    def user(predicate: Char => Boolean): Boolean = {
        predicate('3')
    }

    def main(args: Array[String]): Unit = {

        var b0 = false;
        for( i <- 1 to 100 ) { // warm up
             b0 ||= user(Character.isDefined)
        }
        println(b0)

        // start debugging here
        val b1 = user(Character.isDigit);
        println(b1)
        val b2 = user(c => c == 'a');
        println(b2)
    }
}

据我所知,涉及的参数或return类型被参数化时,预期boxing/unboxing。但这种情况并非如此。 <=错

Scala 版本 2.13.3

user 接受类型 Char => Boolean 的参数,它是 Function1[Char, Boolean] 的语法糖。 Function1 是 Scala 标准库中的泛型特征,并且由于泛型是通过 JVM 上的擦除实现的,因此类型 Char 在运行时被擦除为 java.lang.Object。因此,Char在传递给函数时需要装箱。

为避免这种情况,您可以定义自己的特征:

trait CharPredicate {
  def apply(c: Char): Boolean
}

因为这个特征不是通用的,所以不会进行类型擦除,因此不会进行装箱。您仍然可以使用函数字面量语法,因为 Scala 允许使用单个抽象方法实现所有特征。