我有一个通用类型:
trait BaseTrait[T <: BaseTrait[T]] {
self: T =>
def similar(that: T): Float
}
具体类型:
class MyConcrete(val..) extends BaseTrait[MyConcrete] {
type Self = MyConcrete
..
def similar(that: MyConcrete) = {
return 0.5f // dummy
}
}
我想写这样的东西:
def create[T <: BaseTrait[T]](..): T = new MyConcrete(..)
我得到错误:
type mismatch; found: MyConcrete required: T
我期待由于 MyConcrete 是 BaseTrait 的子类型,它会起作用(但我错了)
我的意图是隐藏 MyConcrete 的构造,以便以后可以将上面的内容更改为 MyConcrete2(它也像 MyConcrete 一样扩展 BaseTrait),并且只关心 BaseTrait 接口的代码不会受到我的更改的影响。
如何编写我的 create 方法的接口。
谢谢。