我有3个班级:
class AClass
class Base { val a = "a" }
class BaseOne extends Base { val b = "b" }
class BaseTwo extends Base { val c = "c" }
我想扩展包含通用方法的特征,我不允许更改特征
trait Converter {
def toAClass[T <: Base](e: T): AClass
def fromAClass[T <: Base](s: AClass): T
}
我想在几个不同的对象中扩展它
object ConverterBaseOne extends Converter {
// ERROR
override def toAClass(e: BaseOne) : AClass = { printf(e.b) } // b is known
override def fromAlcass(a: AClass) : BaseTwo = {....}
}
我知道有一种方法可以使用类参数:trait Converter [T&lt;:Base] 还看到了这篇文章https://stackoverflow.com/a/4627144/980275 我问是否有一个没有改变特征的解决方案??? 谢谢
答案 0 :(得分:5)
您正在更改方法的签名,因此它不是合法覆盖,它会破坏多态性。您必须参数化Converter
特征或使用其他方法名称。
但是,您可以接收Base
对象并进行转换,但不推荐练习,因为它可能会在运行时导致异常:
object ConverterBaseOne extends Converter {
override def toAClass[T <: Base](e: T): AClass = {
printf(e.asInstanceOf[BaseOne].b)
// ...
}
}