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 允许使用单个抽象方法实现所有特征。
根据调试器,在以下代码片段中,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 允许使用单个抽象方法实现所有特征。