Phi*_*lip 0 arrays generics scala
我正在尝试编写一个函数来计算类型为T的元素数组中的元素数量,这些元素通过了T => Boolean类型的测试.
到目前为止我所拥有的是:
def countPass[T](elem: Array[T]) = {
var count = 0
for(x <- elem)
x match {
case x: T => count += 1
}
count
}
//TEST
println(countPass[Boolean](Array(true, 52, "test")))
Run Code Online (Sandbox Code Playgroud)
我遇到了一些错误,第一个是:
combinators.scala:45: warning: abstract type pattern T is unchecked since
it is eliminated by erasure
case x: T => count += 1
^
Run Code Online (Sandbox Code Playgroud)
下一个错误是:
combinators.scala:54: error: type mismatch;
found : Int(52)
required: Boolean
println(countPass[Boolean](Array(true, 52, "test")))
^
combinators.scala:54: error: type mismatch;
found : String("test")
required: Boolean
println(countPass[Boolean](Array(true, 52, "test")))
^
Run Code Online (Sandbox Code Playgroud)
我不确定第一个错误发生了什么,但是第二个错误它会在不是布尔值的情况下抛出异常.我不希望发生这种情况,因为我只计算数组中T类型元素的数量.
问题:我应该如何重构代码来修复这两个错误?
小智 7
诀窍在于使用ClassTag.完成请求的更好方法如下:
import scala.reflect.ClassTag
object Main extends App {
val array: Array[Any] = Array("string1", "string2", "string3", true, false, 13)
def countPass[Other: ClassTag](array: Array[Any]): Int = {
array.collect { case x: Other => x }.length
}
println(s"countPass String = ${countPass[String](array)}")
println(s"countPass Boolean = ${countPass[Boolean](array)}")
println(s"countPass Int = ${countPass[Int](array)}")
}
Run Code Online (Sandbox Code Playgroud)
您可以阅读此内容以了解有关ClassTag和的更多信息TypeTag