Zgodnie z „ 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>
classOf[T]
Metoda zwraca reprezentację środowiska wykonawczego dla typu Scala. Jest to analogiczne do wyrażenia Java T.class
.
Używanie classOf[T]
jest wygodne, gdy masz typ, o którym chcesz uzyskać informacje, natomiast getClass
jest wygodne do pobierania tych samych informacji z wystąpienia typu.
Jednak classOf[T]
i getClass
powrót nieco różne wartości, co odzwierciedla wpływ typu usunięcia w JVM w przypadku getClass.
scala> classOf[C]
res0: java.lang.Class[C] = class C
scala> c.getClass
res1: java.lang.Class[_] = class C
Dlatego następujące działania nie będą działać :
val xClass: Class[X] = new X().getClass //it returns Class[_], nor Class[X]
val integerClass: Class[Integer] = new Integer(5).getClass //similar error
Istnieje bilet dotyczący rodzaju zwrotugetClass
.
( James Moore informuje, że bilet jest „teraz”, tj. Listopad 2011, dwa lata później, naprawiony.
W wersji 2.9.1 getClass
teraz:
scala> "foo".getClass
res0: java.lang.Class[_ <: java.lang.String] = class java.lang.String
)
W 2009 roku:
Byłoby użyteczne, gdyby Scala traktował zwrot z getClass () jako java.lang.Class [T] forSome {val T: C}, gdzie C jest jak usunięcie statycznego typu wyrażenia, na którym getClass jest nazywa
Pozwoliłoby mi to zrobić coś takiego, gdy chcę introspekcji w klasie, ale nie powinienem potrzebować instancji klasy.
Chcę również ograniczyć rodzaje klas, na których chcę introspekcji, więc używam Class [_ <: Foo]. Ale to uniemożliwia mi przekazanie klasy Foo za pomocą Foo.getClass () bez obsady.
Uwaga: w związku getClass
z możliwym obejściem byłoby:
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