scala:如何在自己的构造函数中获取类

mcc*_*lum 4 constructor scala

我需要访问在自己的构造函数中构造的对象的类(出于各种详细原因,我认为这与我的问题无关).

我想要这样的东西

class Foo(val i:Int)
class Bar extends Foo(this.getClass.getName.length)
val b = new Bar
println(b.i)
Run Code Online (Sandbox Code Playgroud)

打印3("Bar".length).但事实并非如此.如果上面的代码在某个其他对象中,则"this"指的是该对象.如果上面的代码不在某个其他对象中(仅在某个包中),编译器会抱怨

error: this can be used only in a class, object, or template
class Bar extends Foo(this.getClass.getName)
                      ^
Run Code Online (Sandbox Code Playgroud)

澄清:我不能改变Foo在其体内使用val而不是它的构造函数,因为Foo的API已经存在并且是固定的(所以,是的,必须是构造函数参数).它在构造函数时需要一个整数参数,但只能通过访问Class来计算该整数.

(我知道上面的例子仍然是愚蠢和堕落.如果人们关心,我可以详细解释为什么我需要在我的真实项目中使用该课程,http://code.google.com/p/factorie)

当然,正在构造的对象的类在构造期间对编译器和运行时是已知的.用什么语法可以得到它?(有没有这样的语法?如果没有,我想知道为什么.我很惊讶它似乎没有一个简单,标准的方法来获得这个.)

Ran*_*ulz 8

懒惰的val解决了这个问题:

object Early
{
    abstract class Foo { val name: String }

    class Bar extends Foo { lazy val name = getClass.getName }

    def
    main(args: Array[String]): Unit = {
        val b = new Bar
        println(b.name)
    }
}
Run Code Online (Sandbox Code Playgroud)

产量:

% scala Early
Early$Bar
Run Code Online (Sandbox Code Playgroud)