Apakah mungkin untuk menulis fungsi generik yang menerima nilai bertipe "Any" dan argumen tipe generik mengatakan "T" dan mengembalikan Option[T] dengan memeriksa tipe runtime dari nilai yang diteruskan?
Saya mencoba di repl (Scala versi 2.11.7 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_66))
def cast[T](x: Any): Option[T] = x match {
case v: T => Some(v)
case _ => Option.empty[T]
}
Saya mendapat peringatan:
warning: abstract type pattern T is unchecked since it is eliminated by erasure
case v: T => Some(v)
Bagaimana cara saya meneruskan tipe kelas dan melakukan pemeriksaan tipe eksplisit alih-alih generik?
P.S. jelas karena penghapusan tipe, kode di atas meledak. Contoh interaksi balasan :
scala> val x :Any = 123
x: Any = 123
scala> cast[Int](x)
res0: Option[Int] = Some(123)
scala> cast[String](x)
res1: Option[String] = Some(123)
scala> val x :Any = "dfg"
x: Any = dfg
scala> cast[Int](x)
res2: Option[Int] = Some(dfg)
scala> cast[Int](x).get
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
at scala.runtime.BoxesRunTime.unboxToInt(BoxesRunTime.java:101)
... 33 elided