ตามที่ " ระบบประเภทสกาล่า "
val c = new C
val clazz = c.getClass // method from java.lang.Object
val clazz2 = classOf[C] // Scala method: classOf[C] ~ C.class
val methods = clazz.getMethods // method from java.lang.Class<T>
classOf[T]
วิธีการส่งกลับเป็นตัวแทนรันไทม์สำหรับชนิดสกาล่า T.class
มันจะคล้ายคลึงกับการแสดงออก Java
การใช้classOf[T]
สะดวกเมื่อคุณมีประเภทที่คุณต้องการข้อมูลในขณะที่getClass
สะดวกในการดึงข้อมูลเดียวกันจากอินสแตนซ์ของประเภท
อย่างไรก็ตามclassOf[T]
และgetClass
ส่งคืนค่าที่แตกต่างกันเล็กน้อยซึ่งสะท้อนถึงผลกระทบของการลบประเภทใน JVM ในกรณีของ getClass
scala> classOf[C]
res0: java.lang.Class[C] = class C
scala> c.getClass
res1: java.lang.Class[_] = class C
นั่นคือเหตุผลที่ต่อไปนี้จะไม่ทำงาน :
val xClass: Class[X] = new X().getClass //it returns Class[_], nor Class[X]
val integerClass: Class[Integer] = new Integer(5).getClass //similar error
มีความเป็นตั๋วเกี่ยวกับประเภทการกลับมาของgetClass
( James Mooreรายงานว่าตั๋วเป็น "ตอนนี้" คือพฤศจิกายน 2011 สองปีต่อมาคงที่
ใน 2.9.1 getClass
ตอนนี้จะ:
scala> "foo".getClass
res0: java.lang.Class[_ <: java.lang.String] = class java.lang.String
)
ย้อนกลับไปในปี 2009:
มันจะมีประโยชน์ถ้าสกาล่าจะรักษาผลตอบแทนจาก getClass () เป็น java.lang.Class [T] forSome {val T: C} โดยที่ C เป็นสิ่งที่ต้องการลบประเภทคงที่ของการแสดงออกที่ getClass เป็น เรียกว่า
มันจะให้ฉันทำสิ่งต่อไปนี้ที่ฉันต้องการวิปัสสนาในชั้นเรียน แต่ไม่ควรต้องการอินสแตนซ์ของคลาส
ฉันต้องการ จำกัด ประเภทของคลาสที่ฉันต้องการจะใคร่ครวญด้วยดังนั้นฉันจึงใช้ Class [_ <: Foo] แต่สิ่งนี้ทำให้ฉันไม่สามารถผ่านคลาส Foo ได้โดยใช้ Foo.getClass () โดยไม่ต้องส่ง
หมายเหตุ: เกี่ยวกับgetClass
วิธีแก้ปัญหาที่เป็นไปได้คือ:
class NiceObject[T <: AnyRef](x : T) {
def niceClass : Class[_ <: T] = x.getClass.asInstanceOf[Class[T]]
}
implicit def toNiceObject[T <: AnyRef](x : T) = new NiceObject(x)
scala> "Hello world".niceClass
res11: java.lang.Class[_ <: java.lang.String] = class java.lang.String