Передача класса 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.