Java java.lang.Class <T> Nesnesinin Scala eşdeğeri


183

Soru en iyi bir örnekle açıklanmaktadır:

Bir JPA EntityManager için Java'da aşağıdakileri yapabilirim (Hesap benim Entity sınıfımdır):

Account result = manager.find(Account.class, primaryKey);

Scala'da naif girişimim:

val result = manager.find(Account.class, primaryKey)

Ama Account.classScala'da kullanmaya çalıştığımda öyle görünmüyor. Scala'daki Account sınıfı için java.lang.Class nesnesini nasıl belirtebilirim?


VonC zaten cevabı verdi, ama Scala & Erasure hakkındaki kendi sorum / cevabımıza bir göz atın . Sanırım işleri denediklerinden farklı bir şekilde yapman için sana fikirler verebilir.
Daniel C. Sobral

Yanıtlar:


264

" 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 getClassgetClass 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

4
FYI, @VonC adlı bilet 22 / Haz / 11 tarihinde sabit olarak işaretlendi. 2.9.1 yılında getClass şimdi yapar: scala> "foo" .getClass res0: java.lang.Class [_ <: java.lang.String] = sınıf java.lang.String
James Moore

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.