您需要在实现中定义实际类型。看看
scala-doc
是的。
下面是一个编译示例:
case class MyConfigs()
trait WithMyConfigs {
def myConfigs: MyConfigs
}
case class LimitConfigs(myConfigs: MyConfigs, limit: Int) extends WithMyConfigs
case class TextConfigs(myConfigs: MyConfigs, text: String) extends WithMyConfigs
trait AbstractClass {
type T <: WithMyConfigs
def configs :T
}
class ImplLimitClass extends AbstractClass {
type T = LimitConfigs
override def configs: T = LimitConfigs(MyConfigs(), 5)
}
class ImplSizeClass extends AbstractClass {
type T = TextConfigs
override def configs: T = TextConfigs(MyConfigs(), "test")
}
trait WithRestrictedConfigs extends WithMyConfigs {
def additionalIntField: Int
}
trait RestrictedAbstractClass extends AbstractClass {
type T <: WithRestrictedConfigs
override def configs: T
}
case class RestrictedConfigs(myConfigs: MyConfigs, additionalIntField: Int) extends WithRestrictedConfigs
class ImplRestrictedClass extends RestrictedAbstractClass {
type T = RestrictedConfigs
override def configs: T = RestrictedConfigs(MyConfigs(), 5)
}
[更新]
你需要在某个地方指定你的类型。如果使用类型参数,您将得到如下信息:
trait AbstractClass[T <: WithMyConfigs] {
def configs: T
}
class ImplLimitClass extends AbstractClass[LimitConfigs] {
override def configs = LimitConfigs(MyConfigs(), 5)
}
class ImplSizeClass extends AbstractClass[WithMyConfigs] {
override def configs = TextConfigs(MyConfigs(), "test")
}
当然,您可以指定特性本身来获得更一般的配置(参见
ImplSizeClass
以上)
然后用一个额外的特征隐藏类型参数。
trait SpecAbstractClass extends AbstractClass[WithMyConfigs]
如果您不想指定显式类型,为什么不使用老式的接口方式:
case class MyConfigs()
trait WithMyConfigs {
def myConfigs: MyConfigs
}
case class LimitConfigs(myConfigs: MyConfigs, limit: Int) extends WithMyConfigs
case class TextConfigs(myConfigs: MyConfigs, text: String) extends WithMyConfigs
trait AbstractClass {
def configs: WithMyConfigs
}
class ImplLimitClass extends AbstractClass {
override def configs = LimitConfigs(MyConfigs(), 5)
}
class ImplSizeClass extends AbstractClass {
override def configs = TextConfigs(MyConfigs(), "test")
}
trait WithRestrictedConfigs extends WithMyConfigs {
def additionalIntField: Int
}
trait RestrictedAbstractClass extends AbstractClass {
override def configs: WithRestrictedConfigs
}
case class RestrictedConfigs(myConfigs: MyConfigs, additionalIntField: Int) extends WithRestrictedConfigs
class ImplRestrictedClass extends RestrictedAbstractClass {
override def configs = RestrictedConfigs(MyConfigs(), 5)
}