Передача класса Scala в качестве параметра?
Я хочу передать класс как параметр функции Scala, например:
def sampleFunc (c : Class) : List[Any]
(Боковой вопрос: должен ли тип параметра быть классом или классом [_]?)
Причина, по которой я передаю тип класса, - проверить, принадлежит ли объект определенному типу или нет. На данный момент, как обходной путь, я передаю образец объекта методу и сравнивая результат двух объектов.getClass. Я почти не думаю, что это идеальный вариант, хотя я уверен, что существует четкий способ передачи типов в Scala.
Ответы
Ответ 1
Ну, к вашему первоначальному вопросу: Да, вы можете передать Scala Class в качестве аргумента. Поскольку Class
является конструктором типа, ему нужен конкретный тип, чтобы сделать тип, который будет использоваться в аргументе. Вы можете использовать экзистенциальный тип шаблона Class[_]
как вы это делали.
def sample(c: Class[_]) = println("Get a class")
sample(classOf[Int])
Однако, если вы хотите проверить, является ли объект определенного типа, я рекомендую вам использовать =:=
, в сочетании с параметром по умолчанию
def checkType[T](obj: T)(implict ev: T =:= Int = null) =
if (ev == null) "get other"
else "get int"
checkType(123) // get int
checkType("123") // get other
Ответ 2
Да. В общем случае это ClassTag
/ TypeTag
- см. Зеркала и отражение
import scala.reflect._
def runtimeClass[T: ClassTag] = classTag[T].runtimeClass
scala> runtimeClass[String]
res2: Class[_] = class java.lang.String
Если вам действительно нужно только проверить равенство формального типа
scala> implicitly[String =:= Double]
<console>:14: error: Cannot prove that String =:= Double.
implicitly[String =:= Double]
^
Если вам действительно нужно проверить только тип объекта:
scala> "aa".isInstanceOf[String]
res4: Boolean = true
Ответ 3
В Scala, если вам нужно заниматься классами, возможно, есть другой способ подойти к проблеме.
Поэтому я не претендую на разрешение названия вопроса, а конкретную необходимость, которую вы публикуете. Чтобы проверить, является ли конкретный объект определенного типа, типичным подходом в Scala является использование сопоставления шаблонов. Если я что-то не упустил, это должно сработать
def checkType(obj: Any) = obj match {
case y: Int => "get int"
case _ => "Other"
}
См. Http://docs.scala-lang.org/tutorials/tour/pattern-matching.html.