我正在努力了解如何尽可能地将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()
上的类型特异性输出
我缺少什么/不理解?
答案 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] = ...
}