Chỉ cần gọi Class#isAssignable
nên đủ:
def isCollectionLike[T](manifest: Manifest[T]):Boolean = {
classOf[scala.collection.TraversableLike[_,_]].isAssignableFrom(manifest.runtimeClass)
}
kiểm tra REPL bắt buộc:
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
Lưu ý rằng mặc dù điều này sẽ không làm việc với mảng, vì lý do đơn giản rằng scala mảng bây giờ (kể từ scala 2.8) ánh xạ trực tiếp vào các mảng JVM udnerlying, và như vậy không kế thừa TraversableLike
(Nếu bạn quan tâm, bạn có thể xem http://docs.scala-lang.org/sips/completed/scala-2-8-arrays.html).
scala> isCollectionLike(manifest[Array[String]])
res20: Boolean = false
Vì vậy, bạn sẽ phải xử lý trường hợp đặc biệt hoặc tìm cách tốt hơn để thử nghiệm bộ sưu tập.
Như một mặt lưu ý, những ngày này có một thay thế cho api phản ánh của java phản ánh scala (và ngoài Manifest
được phản đối ủng hộ TypeTag
), đó có lợi thế to lớn của sự hiểu biết tất cả các scala tính năng cụ thể (rằng Class
trường hợp được truy xuất bởi runtimeClass
không biết gì về scala). Nhưng nó cũng phức tạp hơn, và (hiện tại) không an toàn chút nào, đó là một hạn chế lớn.
Ngoài ra trong trường hợp của bạn, bạn vẫn sẽ phải xử lý các mảng dưới dạng trường hợp đặc biệt.
Nguồn
2013-12-16 10:13:40
Chính xác những gì tôi cần, cảm ơn bạn rất nhiều. – Yosefki