我对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