2013-12-16 12 views

Odpowiedz

9

Wystarczy nazywając Class#isAssignable powinno wystarczyć:

def isCollectionLike[T](manifest: Manifest[T]):Boolean = { 
    classOf[scala.collection.TraversableLike[_,_]].isAssignableFrom(manifest.runtimeClass) 
} 

Obowiązkowe testy REPL:

scala> isCollectionLike(manifest[List[Int]]) 
res17: Boolean = true 

scala> isCollectionLike(manifest[String]) 
res18: Boolean = false 

scala> isCollectionLike(manifest[scala.collection.SeqLike[Int,_]]) 
res19: Boolean = true 

Uwaga jednak, że to nie będzie działać z tablicami, z tego prostego powodu, że scala tablice obecnie (od scala 2.8) bezpośrednio na tablice JVM udnerlying, i jako takie nie dziedziczą TraversableLike (Jeśli jesteś zainteresowany, możesz obejrzeć http://docs.scala-lang.org/sips/completed/scala-2-8-arrays.html).

scala> isCollectionLike(manifest[Array[String]]) 
res20: Boolean = false 

Więc będziesz musiał obsługiwać go jako szczególny przypadek, lub znaleźć lepszy sposób, aby przetestować dla kolekcji.

Na marginesie, w dzisiejszych czasach nie jest alternatywą dla Java odbicie Scala własnej refleksji API (a dodatkowo Manifest jest zastąpiona TypeTag) która ma ogromną zaletę, rozumiejąc specyfikę wszystkich Scala (ta instancja Class ponownie uruchomiona przez runtimeClass nic nie wie o scala). Ale jest także bardziej skomplikowany i (obecnie) nie jest w ogóle bezpieczny, co jest poważnym ograniczeniem.

Ponadto w twoim przypadku nadal będziesz musiał obsługiwać tablice jako specjalny przypadek.

+0

Dokładnie to, czego potrzebowałem, dziękuję bardzo. – Yosefki

Powiązane problemy