我有点难以理解如何以尽可能干/简单的方式使用 Scala 的抽象类型。假设我有以下内容:
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()
上的类型特异性输出。
我缺少/不理解什么?
最佳答案
在使用泛型类型的同时,我看不出有什么方法可以做到这一点,但是如果您可以改用类型成员,您会得到:
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]()
关于scala - 我可以将 'nesting' 与 Scala 抽象类型一起使用来简化类定义吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8801651/