簡體   English   中英

用通用方法覆蓋scala特征

[英]scala override trait with generic method

我有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 <:Base],並且還看到了這篇文章https://stackoverflow.com/a/4627144/980275我在問是否有解決方案而不更改特質??? 謝謝

您正在更改方法的簽名,因此它不是合法的替代,它會破壞多態性。 您必須參數化Converter特質或使用其他方法名稱。

但是,您可以接收Base對象並將其強制轉換,但是不建議您這樣做,因為它可能會在運行時導致異常:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM