Jea*_*let 6 singleton types scala object
我正在编写一个类作为一系列单例对象的基类.在每个单例对象中,将有表示某些属性的val,我想编写一个方法,对于每个单例对象,它只接受由它创建的对象.
所以我有以下内容:
class Obj[M <: Maker]
class Maker {
implicit val me: this.type = this
def make[M <: Maker](implicit maker: M) = new Obj[M]
def accept(obj: Obj[this.type]) = {...}
}
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.然后我想声明其中一个单例对象:
object M extends Maker {
val a = make
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我试试这个:
M.accept(M.a)
Run Code Online (Sandbox Code Playgroud)
然后我得到一个编译时错误:
type mismatch; found : com.test.Obj[object com.test.M] required: com.test.Obj[com.test.M.type]
Run Code Online (Sandbox Code Playgroud)
我的问题:
object com.test.M,它与它有什么不同com.test.M.type?psp*_*psp 16
与时俱进,我的好人!我在24小时前解决了这个问题.接下来我希望看到速龙战斗机追逐渡渡鸟,疯狂地打开他们的马车鞭子,同时查看他们的点播屏幕上的股票报价.
有问题的提交是:http://lampsvn.epfl.ch/trac/scala/changeset/23622
// 1130.scala
class Obj[M <: Maker]
class Maker {
implicit val me: this.type = this
def make[M <: Maker](implicit maker: M) = new Obj[M]
def accept(obj: Obj[this.type]) = ()
}
object M extends Maker {
val a = make
}
object Test {
def main(args: Array[String]): Unit = {
M.accept(M.a)
}
}
// too old
% /scala/inst/scala-2.9.0.r23619/bin/scalac ./1130.scala
./1130.scala:15: error: type mismatch;
found : Obj[object M]
required: Obj[M.type]
M.accept(M.a)
^
one error found
// fresh enough
% /scala/inst/scala-2.9.0.r23624/bin/scalac ./1130.scala
%
Run Code Online (Sandbox Code Playgroud)
用this.type而不是M.这个简化的例子应该有效:
class Obj[M <: Maker]
class Maker {
def make() = new Obj[this.type]
def accept(obj: Obj[this.type]) = println(obj)
}
object M extends Maker
object N extends Maker
M.accept(M.make()) //works!
M.accept(N.make()) //error! type mismatch!
Run Code Online (Sandbox Code Playgroud)