scala - 我可以将 'nesting' 与 Scala 抽象类型一起使用来简化类定义吗?

标签 scala types

我有点难以理解如何以尽可能干/简单的方式使用 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/

相关文章:

scala - 为什么更喜欢隐式 val 而不是隐式对象

Scala:为什么修复类型成员会创建 Java 子类?

performance - Scala - 调用 'first class functions' 的开销

C#如何获取正在设置的属性的名称

javascript - 在 mapstart 上隐藏单个标记组

Scala:覆盖类型方法

Scala 优雅的列表理解,如 F#

python - Numpy 数据类型 : data type not understood

c++ - 就静态类型绑定(bind)而言,隐式声明的示例是什么?

c - 混合 typedef 和定义来强制数据类型大小