【发布时间】:2018-06-24 12:38:44
【问题描述】:
我需要一些有关 Scala 通用特征的帮助。
我有一个类,其方法返回类型 T。 在我的类的每个实现中,我想返回一个可以使用的 T 子类。
基本上,在我的抽象类中,我需要一个返回 Configs 对象的方法,并且每个实现都有自己的 Configs 对象实现。 另外,我想用另一个抽象类子类化抽象类,更加限制这个 Configs 对象(原始 Configs 对象的子类)。无论我做什么,都会出现编译错误。
这是我尝试过的:
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[B <: WithMyConfigs]: B
}
class ImplLimitClass extends AbstractClass {
override def configs[B <: WithMyConfigs]: B = LimitConfigs(MyConfigs(), 5)
}
class ImplSizeClass extends AbstractClass {
override def configs[B <: WithMyConfigs]: B = TextConfigs(MyConfigs(), "test")
}
trait WithRestrictedConfigs extends WithMyConfigs {
def additionalIntField: Int
}
trait RestrictedAbstractClass extends AbstractClass {
override def configs[B <: WithRestrictedConfigs]: B
}
case class RestrictedConfigs(myConfigs: MyConfigs, additionalIntField: Int) extends WithRestrictedConfigs
class ImplRestrictedClass extends RestrictedAbstractClass {
override def configs[B <: WithRestrictedConfigs]: B = RestrictedConfigs(MyConfigs(), 5)
}
这样我得到错误“TextConfigs/LimitConfigs 类型的表达式不符合预期的 B 类型”。
我还尝试了以下方法:
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 B <: WithMyConfigs
def configs: B
}
class ImplLimitClass extends AbstractClass {
override def configs: B = LimitConfigs(MyConfigs(), 5)
}
class ImplSizeClass extends AbstractClass {
override def configs: B = TextConfigs(MyConfigs(), "test")
}
trait WithRestrictedConfigs extends WithMyConfigs {
def additionalIntField: Int
}
trait RestrictedAbstractClass extends AbstractClass {
override type B <: WithRestrictedConfigs
override def configs: B
}
case class RestrictedConfigs(myConfigs: MyConfigs, additionalIntField: Int) extends WithRestrictedConfigs
class ImplRestrictedClass extends RestrictedAbstractClass {
override def configs: B = RestrictedConfigs(MyConfigs(), 5)
}
然后我得到“XXX 类型的表达式不符合预期的 ImplRestrictedClass.this.B 类型”。
如果有人知道如何提供帮助,那就太好了:)
【问题讨论】:
标签: scala generics types abstract