Scala反射:我能看看某个东西是否是(case)对象吗?

Scala反射:我能看看某个东西是否是(case)对象吗?,scala,reflection,Scala,Reflection,在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 作为第一近似值,您可以 def isObject(c: Class[_]): Boolean = c.getName.endsWith("$") 因为为单个对象y

在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

作为第一近似值,您可以

def isObject(c: Class[_]): Boolean = c.getName.endsWith("$")
因为为单个
对象y
创建的匿名类具有名称
y$
,而通常的匿名类(例如
newanyref{}
)以
$
结尾

但是创建
类y$
也是合法的,这会给出错误的肯定;然而,这样的名字在实践中并不多见


使用应该可以得到更精确的答案。

作为第一近似值,您可以这样做

def isObject(c: Class[_]): Boolean = c.getName.endsWith("$")
因为为单个
对象y
创建的匿名类具有名称
y$
,而通常的匿名类(例如
newanyref{}
)以
$
结尾

但是创建
类y$
也是合法的,这会给出错误的肯定;然而,这样的名字在实践中并不多见


使用应该可以得到更精确的答案。

使用
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

使用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

为什么这对你很重要?对你来说,
val obj=newy
val obj=newanyref{}
object obj{}
之间有什么区别?这不重要,只是好奇。为什么这对你很重要?对您来说,
val obj=newy
val obj=newanyref{}
object obj{}
之间有什么区别?这并不重要,只是好奇而已。我将scala版本硬编码到依赖项中,这是非常错误的。谢谢@Suma的编辑!同时编辑:我将scala版本硬编码到依赖项中,这是非常错误的。谢谢@Suma的编辑!还编辑:和