【发布时间】:2013-10-23 15:43:20
【问题描述】:
我有一个泛型类型:
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方法的接口怎么写。
谢谢。
【问题讨论】:
-
自类型注释约束具体(可实例化)子类型的类型,但除非明确混入,否则该约束不会成为特征或其子类型的外部类型的一部分。
标签: scala generics polymorphism