Получить класс <T>во время компиляции? - PullRequest
4 голосов
/ 08 сентября 2011

В Java вы можете написать:

Class<SomeClass> foo = SomeClass.class;

Я играю со Scala и хочу немного больше: я хочу получить метод (и его общий тип) во время компиляции, например так:

val foo : Method[...] = SomeClass.class.someMethod

или даже:

val foo : Method[...] = someObject.class.someMethod

Есть ли способ сделать что-то подобное в Scala?

Ответы [ 2 ]

6 голосов
/ 08 сентября 2011

Возможно, за единственным исключением взаимодействия с библиотекой Java, которое требует Method экземпляров, никогда не будет необходимости делать это в Scala.

Если вам нужно передать метод вокругдля последующего вызова;затем частично примените его для создания FunctionN экземпляра, передайте его с помощью параметра по имени или создайте его непосредственно как первоклассную функцию в первом случае.

Если вам нужно подумать о методетак что вы можете обойти приватную видимость, возможно, для тестирования, тогда вам действительно следует реорганизовать свой дизайн, чтобы избежать этого ограничения видимости.

Если вы просто изучаете Scala и видите, как концепции сравниваются с java,Или, если вы достаточно неудачливы, чтобы столкнуться с неудачным случаем взаимодействия, тогда эквивалентная конструкция для SomeClass.class равна classOf[SomeClass].Надеюсь, вам это никогда не понадобится:)

2 голосов
/ 09 сентября 2011

Для класса:

val classOfClass = classOf[SomeClass]

Для объекта (различие в использовании getClass важно, поскольку в противном случае класс объекта-компаньона был бы недоступен):

val classOfObject = SomeClass.getClass

Принимая код, подобный следующему:

class SomeClass {
  def someMethod() {}
}

object SomeClass

После этого вы можете использовать операции отражения Java, такие как Class#getMethod(String,Class<?>...) (при условии, что someMethod не имеет параметров):

val method = classOfClass.getMethod("someMethod")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...