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

时间:2017-06-09 09:33:54

标签: scala

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

var x = Array(1,2,3)
x.isInstanceOf[Array[Any]] // which is false

我希望它是真的。

更新

我有一个功能:

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
    }
}

2 个答案:

答案 0 :(得分:6)

数组Array(1,2,3)的类型为Int,因此Array[Any]只会在Array collection的情况下奇怪地返回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

scala.Int扩展AnyVal扩展Any,您可以明确提及_ extends AnyVal

但是List[T]之类的其他scala集合是List[Any]的实例

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

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

此外,List[T]Seq[Any]的实例,因为List延伸SeqT延伸Any

scala> List(1, 2).isInstanceOf[Seq[Any]]
res35: Boolean = true
您可以使用模式匹配方式解决if else

AND,

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

答案 1 :(得分:3)

x.isInstanceOf[Array[_]]

使用_容器任何类型匹配。对于_,它被称为存在类型

文件:

Underscore for existential type in Scala

相关问题