斯卡拉覆盖特质与泛型方法(scala override trait with generic met

2019-10-18 09:40发布

我有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 = {....}
 }

我知道有一种方法与类参数做到这一点:特质转换器[T <:基本],也看到了这个帖子https://stackoverflow.com/a/4627144/980275我问,如果有不改变的解决方案性状??? 谢谢

Answer 1:

您正在改变方法的签名,所以它不是一个法律覆盖,这将打破多态性。 您必须参数化的Converter特征或使用其他方法名。

你可以,但是,收到一个Base对象,并投它,但它是不推荐的做法,因为这可能导致在运行时异常:

object ConverterBaseOne extends Converter { 
  override def toAClass[T <: Base](e: T): AClass = {
    printf(e.asInstanceOf[BaseOne].b)
    // ...
  }
}


文章来源: scala override trait with generic method