我可以使用'嵌套'使用Scala抽象类型来简化类定义?

时间:2012-01-10 10:20:26

标签: scala types

我正在努力了解如何尽可能地将Scala的抽象类型用作DRY / simple。假设我有以下内容:

trait Product
trait Pallet[A <: Product]
class Import[
  A <: Product,
  B <: Pallet[A]] {

  def offload(): List[A] = {
    ...
  } 
}

class Fridge extends Product
class FridgePallet extends Pallet[Fridge]

val fridges = new Import[Fridge, FridgePallet]()

这有效,但感觉有点冗长 - 鉴于编译器知道FridgePallet是用Fridge键入的,有没有办法简化Import类的输入以消除需要明确的A <: Product声明?我想我正在寻找类似下面的东西(这不起作用):

class Import[B <: Pallet[A <: Product]] {
  def offload(): List[A] = ...
}
val fridges = new Import[FridgePallet]()

我也尝试用A替换_ s - 然后我必须使用.asInstanceOf[List[Fridge]]强制转换来获取offload()上的类型特异性输出

我缺少什么/不理解?

2 个答案:

答案 0 :(得分:4)

在使用泛型类型时,我没有看到这样做的方法,但是如果你可以使用类型成员,那么你得到这个:

trait Product
trait Pallet {
  type A <: Product
}
class Import[B <: Pallet] {
  def offload(): List[B#A] = { ... }
}

class Fridge extends Product
class FridgePallet extends Pallet {
  type A = Fridge
}

val fridges = new Import[FridgePallet]()

答案 1 :(得分:2)

trait Pallet[A <: Product] {
  type ptype = A
}

class Import[P <: Pallet[_]] {
  def offload(): List[P#ptype] = ...
}