" Scala Tipi Sistem " e göre,
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]
Yöntem, bir Scala türü için zamanı temsil döndürür. Java ifadesine benzer T.class
.
Kullanmak classOf[T]
, bilgi istediğiniz bir türe sahip olduğunuzda getClass
, aynı bilgileri türün bir örneğinden almak için de uygundur.
Ancak classOf[T]
ve getClass
getClass durumunda, JVM üzerinde tip silme etkisini yansıtan biraz farklı değerler döndürür.
scala> classOf[C]
res0: java.lang.Class[C] = class C
scala> c.getClass
res1: java.lang.Class[_] = class C
Bu yüzden aşağıdakiler işe yaramaz :
val xClass: Class[X] = new X().getClass //it returns Class[_], nor Class[X]
val integerClass: Class[Integer] = new Integer(5).getClass //similar error
Dönüş türü ile ilgiligetClass
bir bilet var .
( James Moore , biletin "şimdi" olduğunu, yani iki yıl sonra 2011
Kasımının sabit olduğunu bildiriyor. 2.9.1'de getClass
şimdi:
scala> "foo".getClass
res0: java.lang.Class[_ <: java.lang.String] = class java.lang.String
)
2009 yılında:
Scala'nın getClass () 'dan dönüşü bir java.lang.Class [T] forSome {val T: C} olarak ele alması yararlı olacaktır, burada C, getClass'ın bulunduğu ifadenin statik türünün silinmesi gibi bir şeydir aranan
Bir sınıfta iç gözlem yapmak istediğim, ancak bir sınıf örneğine ihtiyaç duymayacağım yerde aşağıdaki gibi bir şey yapmama izin verir.
İç gözlem yapmak istediğim sınıf türlerini de sınırlamak istiyorum, bu yüzden Sınıf [_ <: Foo] kullanıyorum. Ancak bu, oyuncu kadrosu olmadan Foo.getClass () kullanarak bir Foo sınıfından geçmemi engelliyor.
Not: ile ilgili olarak getClass
, olası bir çözüm şöyle olacaktır:
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