Se ho un metodo ...Come posso utilizzare la nuova API reflection per stabilire se il tipo di componente di una matrice è conforme a un parametro di tipo?
def arrayConformsTo[A](as: Array[_]) = ???
... dove posso aggiungere Contesto Bounds-A
come necessario. Voglio questo metodo per guardare il tipo di componente di Array
e restituire true se questo è un sottotipo di A
. Così, per esempio:
arrayConformsTo[Int](Array(1, 2, 3)) //returns true
arrayConformsTo[String](Array(1, 2, 3)) //returns false
Prima di 2.10, questo sarebbe stato fatto come segue:
def arrayConformsTo[A: Manifest](as: Array[_]) =
ClassManifest.fromClass(as.getClass.getComponentType) <:< manifest[A]
Tuttavia adesso compila con warning di deprecazione
<console>:8: warning: method <:< in trait ClassManifestDeprecatedApis is deprecated: Use scala.reflect.runtime.universe.TypeTag for subtype checking instead
ClassManifest.fromClass(as.getClass.getComponentType) <:< manifest[A]
^
<console>:8: warning: value ClassManifest in object Predef is deprecated: Use scala.reflect.ClassTag instead
ClassManifest.fromClass(as.getClass.getComponentType) <:< manifest[A]
La mia prima risposta a questo è la seguente:
scala> def arrayConformsTo[A: reflect.ClassTag](as: Array[_]) =
| reflect.ClassTag(as.getClass.getComponentType) <:< implicitly[reflect.ClassTag[A]]
Ma questo dà un avvertimento deprecazione e
<console>:8: warning: method <:< in trait ClassManifestDeprecatedApis is deprecated: Use scala.reflect.runtime.universe.TypeTag for subtype checking instead
reflect.ClassTag(as.getClass.getComponentType) <:< implicitly[reflect.ClassTag[A]]
^
Mi dice di usare TypeTag
. Ma come? È forse una cosa valida chiedere di riflettere?
Appendice: questo sembra funzionare abbastanza bene per quello che ho bisogno, anche se non funziona per AnyVal
:
scala> def arrayConformsTo[A: reflect.ClassTag](as: Array[_]) =
| implicitly[reflect.ClassTag[A]].runtimeClass isAssignableFrom as.getClass.getComponentType
È grandioso! Se non ti dispiace, ho intenzione di modificare la tua risposta per dare un'altra soluzione prima di accettarla –