2013-12-16 10 views

Trả lời

9

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.

+0

Chính xác những gì tôi cần, cảm ơn bạn rất nhiều. – Yosefki

Các vấn đề liên quan