ฟังก์ชั่นทั่วไปของสกาล่าในการแปลงประเภทใด ๆ เป็นอาร์กิวเมนต์ประเภททั่วไปที่ระบุ

เป็นไปได้ไหมที่จะเขียนฟังก์ชันทั่วไปที่ยอมรับค่าประเภท "ใดๆ" และอาร์กิวเมนต์ประเภททั่วไปพูดว่า "T" และส่งคืน Option[T] โดยการตรวจสอบประเภทรันไทม์ของค่าที่ส่งผ่านเข้าไป

ฉันลอง repl (Scala เวอร์ชัน 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]
}

ฉันได้รับคำเตือน:

 warning: abstract type pattern T is unchecked since it is eliminated by erasure
           case v: T => Some(v)

ฉันจะผ่านประเภทคลาสและทำการตรวจสอบประเภทที่ชัดเจนแทนข้อมูลทั่วไปได้อย่างไร

ป.ล. เห็นได้ชัดว่าเนื่องจากการลบประเภทโค้ดด้านบนจึงระเบิด การโต้ตอบตัวแทนตัวอย่าง:

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   

person sas1138    schedule 14.01.2017    source แหล่งที่มา


คำตอบ (1)