У меня есть гетерогенный список, подобный следующему:
val l = List(1, "One", true)
, и мне нужно отфильтровать его объекты, извлекая только те объекты, которые принадлежат данному классу.Для этой цели я написал очень простой метод, подобный этому:
def filterByClass[A](l: List[_], c: Class[A]) =
l filter (_.asInstanceOf[AnyRef].getClass() == c)
Обратите внимание, что я обязан добавить явное преобразование в AnyRef, чтобы избежать этой проблемы компиляции:
error: type mismatch;
found : _$1 where type _$1
required: ?{val getClass(): ?}
Note that implicit conversions are not applicable because they are ambiguous:
both method any2stringadd in object Predef of type (x: Any)scala.runtime.StringAdd
and method any2ArrowAssoc in object Predef of type [A](x: A)ArrowAssoc[A]
are possible conversion functions from _$1 to ?{val getClass(): ?}
l filter (_.getClass() == c)
Однако, таким образом, вызов:
filterByClass(l, classOf[String])
возвращается, как и ожидалось:
List(One)
, но, конечно, то же самое не работает, например, с Int, поскольку они расширяют Any, ноне AnyRef, поэтому, вызвав:
filterByClass(l, classOf[Int])
результатом будет просто пустой список.
Есть ли способ заставить мой метод filterByClass работать даже с Int, Boolean и всеми другими классамиРасширение Any?