Soy bastante nuevo en Scala y en lenguajes de programación avanzados. Intento resolver el siguiente problema.Extracción de tipo en Scala
que han conseguido:
val s: Seq[SomeMutableType[_]]
que asumen que todos los elementos de la secuencia son del mismo tipo (pero no sabe cuál en este punto).
¿En qué puedo llamar:
def proc[T](v0: SomeMutableType[T], v1: SomeMutableType[T]) { /* ... */ }
con algo como
proc(s(0), s(1))
El compilador se queja:
- coincidencia de tipos; found: SomeMutableType [_ $ 351] donde type _ $ 351 required: SomeMutableType [Any] Nota: _ $ 351 <: Cualquiera, pero la clase SomeMutableType es invariable en el tipo T. Es posible que desee definir T como + T. (SLS 4,5)
pensé en esa cosa covariante, pero no creo que tiene sentido en mi caso. Solo quiero que el compilador me crea cuando digo que s (0) y s (1) son del mismo tipo. Normalmente hago esto a través de un casting, pero no puedo convertir a SomeMutableType [T] aquí ya que T es desconocido debido a borrado. Por supuesto, no puedo cambiar la definición de proc.
¿Cómo se obtiene 's'? Idealmente, debe unir su '_' a algún parámetro de tipo declarado en un método o clase ... –
En realidad, es bastante complicado. SomeMutableType está parametrizado porque hace sens para parametrizarlo. Sin embargo, s es un atributo de una clase C que generalmente no se preocupa por el parámetro, excepto en mi caso de uso particular (donde todos los elementos deben ser del mismo tipo). Puedo suponer que en mi instancia de C, todos los elementos de s son del mismo tipo, pero no es cierto en el caso general. Quizás debería usar alguna subclase de C en este punto, pero haría que algún otro código sea bastante complicado (introduzca métodos de fábrica, etc.), ya que las clases las genera un analizador. – scand1sk
"No hice un seguimiento del tipo, pero sé que es X". - luego, vuélvela a X y manifiesta tu suposición en el código. Si no quieres lanzar, debes TENER un seguimiento del tipo. ¡Es así de simple! – ziggystar