Scala反射:我能看看某个东西是否是(case)对象吗?
在Scala中是否有办法查看类是否定义为对象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
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的编辑!还编辑:和