Scala:如何检查对象是否是Array的实例

xid*_*dui 1 scala

我想检查Scala中的obj是否是Array类型,而不是关心内部是什么类型的值.有一些简单的方法来做到这一点?

var x = Array(1,2,3)
x.isInstanceOf[Array[Any]] // which is false
Run Code Online (Sandbox Code Playgroud)

我希望它是真的.

更新:

我有一个功能:

def someFunction(obj: Any) {
    if (obj.isInstanceOf[Int]) {
        // do something
    }
    if (obj.isInstanceOf[String]) {
        // do something
    }
    if (obj.isInstanceOf[Array[Any]) {
        // for each of the obj inside the Array do something
    }
}
Run Code Online (Sandbox Code Playgroud)

pra*_*upd 7

数组Array(1,2,3)是类型Int,因此Array[Any]只有在Array收集的情况下才会奇怪地返回false .

如果你不关心它的类型Array,你可以比较Array[_](任何类型的数组)

scala> var x = Array(1,2,3)
x: Array[Int] = Array(1, 2, 3)

scala> x.isInstanceOf[Array[Int]]
res0: Boolean = true

scala> x.isInstanceOf[Array[_ <: Any]]
res7: Boolean = true

scala> x.isInstanceOf[Array[_ <: AnyVal]]
res12: Boolean = true

scala> x.isInstanceOf[Array[_]]
res13: Boolean = true
Run Code Online (Sandbox Code Playgroud)

scala.Int扩展AnyVal哪个扩展Any你可以明确提到_ extends AnyVal.

但是其他scala集合就像List[T]List[Any]

scala> List(1, 2).isInstanceOf[List[Any]]
res30: Boolean = true

scala> Seq(1, 2).isInstanceOf[Seq[Any]]
res33: Boolean = true
Run Code Online (Sandbox Code Playgroud)

此外,List[T]是实例Seq[Any],因为List扩展SeqT扩展Any

scala> List(1, 2).isInstanceOf[Seq[Any]]
res35: Boolean = true
Run Code Online (Sandbox Code Playgroud)

AND,if else你可以用模式匹配方式解决,

array match {
   case x: Int => println("int") 
   case x: String => "string" 
   case Array[Int] => println("ints")
   case Array[String] => println("strings")
   case _ => println("whatever")
 }
Run Code Online (Sandbox Code Playgroud)