【发布时间】:2011-05-17 23:19:26
【问题描述】:
我正在编写一个作为一系列单例对象的基类的类。在每个单例对象中,都会有代表某些属性的 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]) = {...}
}
到目前为止,一切都很好。然后我想声明这些单例对象之一:
object M extends Maker {
val a = make
}
但是,如果我尝试这个:
M.accept(M.a)
然后我得到一个编译时错误:
type mismatch; found : com.test.Obj[object com.test.M] required: com.test.Obj[com.test.M.type]
我的问题:
-
object com.test.M是什么类型,和com.test.M.type有什么不同? - 如何以更智能的方式做到这一点?
【问题讨论】:
-
对于第 2 点:总是有可能使
Obj成为Maker的嵌套类并删除类型参数,但我不希望这样,因为我需要传递 Obj我的示例中的类之外的对象的实例,我需要过滤类型参数。 -
您能否提供一个可编译的示例?我可以复制并粘贴到 REPL 中吗?
-
好问题:我在实现 HList 时遇到了同样的问题,HNil 的类型被推断为 object HNil 而不是 HNil.type .升级到 2.9 nightly build,现在一切正常。
标签: scala types object singleton