Scala эквивалент Java java.ленг.объект класса
вопрос лучше всего объяснить на примере:
в Java для JPA EntityManager я могу сделать следующее (учетная запись - это мой класс сущности):
Account result = manager.find(Account.class, primaryKey);
в Scala, моя наивная попытка:
val result = manager.find(Account.class, primaryKey)
но когда я пытаюсь использовать Account.class
в Scala, похоже, это не нравится. Как я могу указать java.ленг.Объект класса для класса учетной записи в Scala?
2 ответа:
по данным "Система Типа Scala",
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]
метод возвращает представление среды выполнения для типа Scala. Это аналогично выражению JavaT.class
.
Используя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
.(Джеймс Мур сообщает, что билет "сейчас", т. е. ноября. 2011, два года спустя, исправлено.
В 2.9.1,getClass
сейчас:scala> "foo".getClass res0: java.lang.Class[_ <: java.lang.String] = class java.lang.String
)
в 2009 году:
было бы полезно, если бы Scala рассматривал возврат из getClass() как java.ленг.Class[T] forSome { val T: C } где C-это что-то вроде стирания статического типа выражения, на котором getClass называется
это позволило бы мне сделать что-то вроде следующего, где я хочу самоанализировать класс, но не должен нуждаться в экземпляре класса.
Я также хочу ограничить типы классов, которые я хочу интроспектировать, поэтому я использую Class [_Примечание: в отношении
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