2013-12-05 3 views
0

я могу проверить, является ли объект о является экземпляром А или В, как что:isInstanceOf для множества возможностей

o.isInstanceOf[A] || o.isInstanceOf[B] 

Но это становится уродливым, если у меня есть больше идей!.

Есть ли способ определить что-то вроде этого:

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

или

o.isInstanceOf(A,B,C,D, ...) 

или

o.isInstanceOf(Set(A,B,C,D, ...)) 

ответ

4
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 
+0

Это работает только для 'Супер'. Я ищу общий метод проверки такого рода проблем, который также возвращает 'Boolean'. – Kigyo

+0

@ Kigyo не совсем * только Super *: 'def isStrOrInt (x: Any) = x match {case _: String | _: Int => true; case _ => false} ', но да, нет возможности параметризовать этот метод, поэтому он может генерироваться над Int/String или любой другой неизвестной ранее комбинацией. –

+0

Ощущается как ограничение для меня. Мне бы хотелось увидеть что-то вроде этого: – Kigyo

0

Просто то, что я пытался, что не удалось с трудом.

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 
Смежные вопросы