Scala 如何确定“this”是类的实例还是对象的实例?

Scala 如何确定“this”是类的实例还是对象的实例?,scala,singleton,instance,Scala,Singleton,Instance,假设我有一个抽象类的两个子类: 对象Child1扩展MyAbstrClass{ ... } 类Child2扩展了MyAbstrClass{ } 现在我想确定(最好是在MyAbstrClass的构造函数中)正在创建的实例是对象还是由new创建的对象: 抽象类MyAbstrClass{ { 如果(/*这是对象吗?*/){ //做点什么 }否则{ //不,是类实例,请执行其他操作 } } } 在Scala有这样的可能吗?我的想法是将所有从类派生的对象收集到一个集合中,但只收集对象,而不是由new创

假设我有一个抽象类的两个子类:

对象Child1扩展MyAbstrClass{
...
}
类Child2扩展了MyAbstrClass{
}
现在我想确定(最好是在
MyAbstrClass
的构造函数中)正在创建的实例是对象还是由
new
创建的对象:

抽象类MyAbstrClass{
{
如果(/*这是对象吗?*/){
//做点什么
}否则{
//不,是类实例,请执行其他操作
}
}
}

在Scala有这样的可能吗?我的想法是将所有从类派生的对象收集到一个集合中,但只收集对象,而不是由
new
创建的实例

trait X {
  println("A singleton? " + getClass.getName.endsWith("$"))
}

object Y extends X
Y // objects are lazily initialised! this enforces it

class Z extends X
new Z
比如:

package objonly

/** There's nothing like a downvote to make you not want to help out on SO. */
abstract class AbsFoo {
  println(s"I'm a ${getClass}")
  if (isObj) {
    println("Object")
  } else {
    println("Mere Instance")
  }
  def isObj: Boolean = isObjReflectively

  def isObjDirty = getClass.getName.endsWith("$")

  import scala.reflect.runtime.{ currentMirror => cm }
  def isObjReflectively = cm.reflect(this).symbol.isModuleClass
}

object Foo1 extends AbsFoo

class Foo2 extends AbsFoo

object Test extends App {
  val foob = new Foo2
  val fooz = new AbsFoo { }
  val f = Foo1
}

我不知道Scala,但作为一名java程序员,这句话让我感到困惑:“但是只有对象,而不是由
new
创建的实例”@Keyser在Scala中是@om nom nom谢谢链接!在Scala 2.10中,p(对象更多地链接到
static
TypeTag
?不完全确定…这远不是一个完美的解决方案,但如果您可以访问源代码并对其进行修改,您可以混合marker-trait,例如
IsObject
,然后使用模式匹配来过滤对象,例如:
foo-match{case-IsObject=>…}
(/否则您可以使用一些反射魔法)什么是IsobjReflective?
isStatic
是不同的。它确定一个符号在某种意义上是否是静态的,即它不需要一个
$outer
实例。更多信息,请查看文档。