Могу ли я использовать «вложение» с абстрактными типами Scala для упрощения определений классов? - PullRequest
3 голосов
/ 10 января 2012

Я изо всех сил пытаюсь понять, как использовать абстрактные типы в 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 на _ s - но тогда я должениспользуйте .asInstanceOf[List[Fridge]] casting, чтобы вернуть специфичность типа в вывод offload().

Что я пропускаю / не понимаю?

Ответы [ 2 ]

4 голосов
/ 10 января 2012

Я не вижу способа сделать это, оставаясь с универсальными типами, но если вместо этого вы можете использовать члены типа, вы получите:

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]()
2 голосов
/ 10 января 2012
trait Pallet[A <: Product] {
  type ptype = A
}

class Import[P <: Pallet[_]] {
  def offload(): List[P#ptype] = ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...