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.
Dokładnie to, czego potrzebowałem, dziękuję bardzo. – Yosefki