que tiene una lista heterogénea como la siguiente:¿Cómo se lee la clase de un objeto Scala que amplía Any pero no AnyRef?
val l = List(1, "One", true)
y necesito filtrar sus objetos extrayendo sólo los que pertenecen a una clase dada. Para este propósito escribí un método muy simple como esto:
def filterByClass[A](l: List[_], c: Class[A]) =
l filter (_.asInstanceOf[AnyRef].getClass() == c)
Tenga en cuenta que estoy obligado a añadir la conversión explícita a AnyRef con el fin de evitar este problema compilación:
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)
Sin embargo, en esta forma la invocación de:
filterByClass(l, classOf[String])
retornos como se esperaba:
List(One)
pero por supuesto el mismo no funciona, por ejemplo, con Int ya que se extiende Cualquier pero no AnyRef, por lo que mediante la invocación:
filterByClass(l, classOf[Int])
el resultado es simplemente la lista vacía.
¿Hay alguna manera de hacer que mi método filterByClass funcione incluso con Int, Boolean y todas las otras clases extendiendo Any?
¿Sería 'filterByClass (l, classof [java.lang.Integer])' ser aceptable? –
¡Qué horrible estructura de datos para trabajar! ¿Cómo terminaste con tal cosa? –
Estoy bastante sorprendido también. Debe haber sido un error muy molesto! Sin embargo, tener un bloque de coincidencia predeterminado para manejar primitivas Java podría ayudar. – Ajay