scala使用泛型方法覆盖特征

Tal*_* G. 1 generics scala type-safety

我有3个班:

class AClass 
class Base { val a = "a" }
class BaseOne extends Base { val b = "b" }
class BaseTwo extends Base { val c = "c" }
Run Code Online (Sandbox Code Playgroud)

我想扩展一个包含泛型方法的特征,我不允许改变特征

trait Converter {
    def toAClass[T <: Base](e: T): AClass
    def fromAClass[T <: Base](s: AClass): T
}
Run Code Online (Sandbox Code Playgroud)

我想在几个不同的对象中扩展它

 object ConverterBaseOne extends Converter { 
 // ERROR
     override def toAClass(e: BaseOne) : AClass = { printf(e.b) } // b is known
     override def fromAlcass(a: AClass) : BaseTwo = {....}
 }
Run Code Online (Sandbox Code Playgroud)

我知道有一种方法可以使用类参数:trait Converter [T <:Base]并看到这篇文章/sf/answers/323900111/ 我问是否有一个没有改变的解决方案特质??? 谢谢

ins*_* me 5

您正在更改方法的签名,因此它不是合法的覆盖,它会破坏多态性.您必须参数化Converter特征或使用其他方法名称.

但是,您可以接收一个Base对象并将其强制转换,但不推荐练习,因为它可能会在运行时导致异常:

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