Scala 多种可能性的isInstanceOf

Scala 多种可能性的isInstanceOf,scala,types,Scala,Types,我可以检查对象o是A还是B的实例,如下所示: o.isInstanceOf[A] || o.isInstanceOf[B] 但如果我有更多的可能性,这会变得丑陋 有没有办法定义这样的东西: o.isInstanceOf[A,B,C,D, ...] 或 或 只是我尝试过的东西,但失败了 def isInstance(o : Any, s : Set[Class[_]]) = s.exists(o.getClass == _) println(isInstance(Nil, Set(Int.g

我可以检查对象o是A还是B的实例,如下所示:

o.isInstanceOf[A] || o.isInstanceOf[B]
但如果我有更多的可能性,这会变得丑陋

有没有办法定义这样的东西:

o.isInstanceOf[A,B,C,D, ...]


只是我尝试过的东西,但失败了

def isInstance(o : Any, s : Set[Class[_]]) = s.exists(o.getClass == _)

println(isInstance(Nil, Set(Int.getClass, List.getClass))) //false
println(Nil.isInstanceOf[List[_]]) //true

println(isInstance(3, Set(Int.getClass, List.getClass))) //false
println(3.isInstanceOf[Int]) //true

只是我尝试过的东西,但失败了

def isInstance(o : Any, s : Set[Class[_]]) = s.exists(o.getClass == _)

println(isInstance(Nil, Set(Int.getClass, List.getClass))) //false
println(Nil.isInstanceOf[List[_]]) //true

println(isInstance(3, Set(Int.getClass, List.getClass))) //false
println(3.isInstanceOf[Int]) //true

这只适用于
Super
现在。我正在寻找一种检查此类问题的通用方法,该方法还返回一个
布尔值
@Kigyo不仅是Super:
def isStrOrInt(x:Any)=x match{case}字符串|}Int=>true;case}=>false}
,但是是的,没有办法参数化这个方法,所以它可以在Int/String或任何其他未知的组合上进行泛化,这对我来说是一个限制。我很想看到这样的东西:@Kigyo解析器吃掉了你的代码!是的,这可能是一个限制,但坦率地说,使用如此灵活的检查是非常罕见的。毕竟,链的实例也必须提前知道,不是吗?是的。我只是懒惰,喜欢一般的解决方案:)。无论如何谢谢你!这只适用于
Super
现在。我正在寻找一种检查此类问题的通用方法,该方法还返回一个
布尔值
@Kigyo不仅是Super:
def isStrOrInt(x:Any)=x match{case}字符串|}Int=>true;case}=>false}
,但是是的,没有办法参数化这个方法,所以它可以在Int/String或任何其他未知的组合上进行泛化,这对我来说是一个限制。我很想看到这样的东西:@Kigyo解析器吃掉了你的代码!是的,这可能是一个限制,但坦率地说,使用如此灵活的检查是非常罕见的。毕竟,链的实例也必须提前知道,不是吗?是的。我只是懒惰,喜欢一般的解决方案:)。无论如何谢谢你!
sealed trait Super
class A extends Super
class B extends Super
class C extends Super
class D extends Super

val unknown: Super = new C
unknown match { case _: A | _: B | _: C => "I'm a super, but not D" } 
// I'm a super, but not D
def isInstance(o : Any, s : Set[Class[_]]) = s.exists(o.getClass == _)

println(isInstance(Nil, Set(Int.getClass, List.getClass))) //false
println(Nil.isInstanceOf[List[_]]) //true

println(isInstance(3, Set(Int.getClass, List.getClass))) //false
println(3.isInstanceOf[Int]) //true