我對Scala編程非常陌生,我非常喜歡代碼可組合的程度。我想寫一些處理可相互轉換的兩個相關對象的特徵,並通過繼續擴展該特徵來構建更多功能,以便在創建對象時可以指定我的泛型的相關類型。這裏是我正在談論的代碼類型的工作玩具示例:Scala可互換的泛型類型
trait FirstConverter[First] {
def toFirst: First
}
trait SecondConverter[Second] {
def toSecond: Second
}
trait TwoWayConverter[First <: SecondConverter[Second], Second <: FirstConverter[First]] {
def firstToSecond(x: First) = x.toSecond
def secondToFirst(x: Second) = x.toFirst
}
trait RoundTripConverter[First <: SecondConverter[Second], Second <: FirstConverter[First]] extends TwoWayConverter[First, Second] {
def firstToFirst(x: First) = secondToFirst(firstToSecond(x))
def secondToSecond(x: Second) = firstToSecond(secondToFirst(x))
}
case class A(s: String) extends SecondConverter[B] {
def toSecond: B = B((s.toInt) + 1)
}
case class B(i: Int) extends FirstConverter[A] {
def toFirst: A = A((i * 2).toString)
}
object ABConverter extends RoundTripConverter[A, B]
object Main {
def main(args: Array[String]): Unit = {
println(ABConverter firstToSecond A("10")) // 11
println(ABConverter secondToFirst B(42)) // 84
println(ABConverter firstToFirst A("1")) // 4
println(ABConverter secondToSecond B(2)) // 5
}
}
雖然這可行,但我不確定它是否是慣用的Scala。我問是否有任何技巧可以使類型定義更加簡潔,如果我可以以某種方式定義類型限制只有一次,並讓它們用於擴展其他特徵的多種特徵。
在此先感謝!
也許只是一種文體上的寵物:我不喜歡這段代碼中toInt或toString的postfix操作 - 我不認爲它們在這裏添加任何東西,對我來說它們只會損害可讀性。特別是我更喜歡'foo.s.toInt + 1' over'(s toInt)+ 1'。 – Suma
@Suma - 真的,我仍然在學習什麼時候使用這個時間,什麼時候不使用。添加了那些。 – Wolfgang
@Wolfgang - 我在同一個方向上搜索了一次。看到,我得到了:http://stackoverflow.com/questions/1154571/scala-abstract-types-vs-generics/10891994#10891994 – ayvango