Scala эквивалент Java `Class` класса? - PullRequest
0 голосов
/ 21 марта 2020

В Java есть класс Class<T>, который представляет, ну, в общем, классы. Это полезно, когда вам нужно динамически проверять некоторые классы во время выполнения, например, если какой-то интерфейс может принимать различное количество аргументов и ожидает, что аргументы имеют указанные c типы: тогда интерфейс может вернуть список Class объекты для уточнения его требований.

По-видимому, он также доступен в Scala, но только как псевдоним для класса Java). Можно ли использовать это в Scala (или вообще в классе Class, в чистом коде Scala), или есть более идиоматический c способ добиться того же самого?

Более подробно, вот о чем я думаю:

trait BuiltInFunction[Node] {
  def symbol: String
  def arity: Int
  def argumentTypes: List[Class[Node]]
  def apply(args: List[Node]): Node
}

BuiltInFunction представляет функции, каждая из которых может иметь разное количество аргументов и ожидать, что аргументы будут разными подтипами Node , Если система встречает функцию, она удостоверится, что она применяется к аргументам соответствующих типов (как определено argumentTypes), вызвав метод apply с этими аргументами.

Использует ли Class правильный способ сделать это в Scala?

1 Ответ

3 голосов
/ 21 марта 2020

Если вам не нужны детали Scala -specifi c (различие между свойствами и методами, последствиями и т. Д. c.) С использованием Class, то это прекрасно; если это не так, он не будет доступен в scala.Predef в качестве псевдонима!

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

OTOH:

  1. List[Class[Node]] не правильно, если вы

    ожидать, что аргументы будут разными подтипами узла

    Вместо него должно быть List[Class[_ <: Node]].

  2. Class отражает только классы после стирания, например classOf[List[String]] и classOf[List[Int]] одинаковы. Если вам нужно их различить, Class будет недостаточно.

...