Menurut " The Scala Type System ",
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>
The classOf[T]
Metode mengembalikan runtime representasi untuk jenis Scala. Ini analog dengan ekspresi Java T.class
.
Penggunaan classOf[T]
nyaman ketika Anda memiliki jenis yang Anda inginkan informasi, sementara getClass
nyaman untuk mengambil informasi yang sama dari turunan jenis.
Namun, classOf[T]
dan getClass
mengembalikan nilai yang sedikit berbeda, yang mencerminkan efek penghapusan tipe pada JVM, dalam kasus getClass.
scala> classOf[C]
res0: java.lang.Class[C] = class C
scala> c.getClass
res1: java.lang.Class[_] = class C
Itu sebabnya yang berikut ini tidak akan berfungsi :
val xClass: Class[X] = new X().getClass //it returns Class[_], nor Class[X]
val integerClass: Class[Integer] = new Integer(5).getClass //similar error
Ada tiket tentang jenis pengembaliangetClass
.
( James Moore melaporkan bahwa tiketnya "sekarang", yaitu November 2011, dua tahun kemudian, diperbaiki.
Pada 2.9.1, getClass
sekarang tidak:
scala> "foo".getClass
res0: java.lang.Class[_ <: java.lang.String] = class java.lang.String
)
Kembali pada tahun 2009:
Akan bermanfaat jika Scala memperlakukan return dari getClass () sebagai java.lang.Class [T] forSome {val T: C} di mana C adalah sesuatu seperti penghapusan tipe statis dari ekspresi di mana getClass adalah dipanggil
Itu akan membiarkan saya melakukan sesuatu seperti berikut di mana saya ingin mengintrospeksi kelas tetapi tidak perlu contoh kelas.
Saya juga ingin membatasi jenis kelas yang ingin saya introspeksi, jadi saya menggunakan Kelas [_ <: Foo]. Tapi ini mencegah saya lulus di kelas Foo dengan menggunakan Foo.getClass () tanpa gips.
Catatan: mengenai getClass
, solusi yang mungkin adalah:
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