Отражение Scala: могу ли я увидеть, является ли что-то (кейс) объектом? - PullRequest
0 голосов
/ 23 ноября 2018

Есть ли способ в Scala увидеть, был ли класс определен как объект?

def isObject(c: Class[_]): Boolean = ???

object X
class Y

val x = X
val y = new Y

isObject(x.getClass) == true
isObject(y.getClass) == false

Ответы [ 2 ]

0 голосов
/ 24 ноября 2018

Используя scala-reflect, кажется, что работает следующее:

object ObjectReflection extends App {

  import scala.reflect.runtime.universe._

  def isObject[T](x: T)(implicit tag: TypeTag[T]): Boolean = PartialFunction.cond(tag.tpe) {
    case SingleType(_, _) => true
  }

  object AnObject
  case object ACaseObject
  class AClass
  case class ACaseClass(i: Int)
  trait ATrait

  println("new AClass     " +  isObject(new AClass))
  println("ACaseClass(42) " +  isObject(ACaseClass(42)))
  println("new ATrait {}  " +  isObject(new ATrait {}))
  println("AnObject       " +  isObject(AnObject))
  println("ACaseObject    " +  isObject(ACaseObject))

}

Отпечатки:

new AClass     false
ACaseClass(42) false
new ATrait {}  false
AnObject       true
ACaseObject    true

Зависит от:

libraryDependencies += "org.scala-lang" % "scala-reflect" % scalaVersion.value
0 голосов
/ 23 ноября 2018

В первом приближении вы можете сделать

def isObject(c: Class[_]): Boolean = c.getName.endsWith("$")

, потому что анонимный класс, созданный для одиночного object y, имеет имя y$, и обычные анонимные классы (такие как new AnyRef {}) заканчиваютсявместо $<number>

Но также допустимо создать class y$, что дало бы ложное срабатывание;однако такие имена редко встречаются на практике.

Использование scala-refle должно позволить получить более точный ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...