使用具体类型扩展ListSet时出现问题

时间:2014-07-17 18:59:35

标签: scala

尝试在Pile类中使用具体类型扩展ListSet,然后每次需要ListSet [ConcreteType]实例时,我都会传递一个Pile实例

class Pile extends ListSet[Card]{
  def this(cards: ListSet[Card]){
    this()
    this ++ cards
  }
  def draw(amount: Int = 1): (Pile, Pile) = this.splitAt(amount)
}

在' draw'方法,编译器指责类型的表达式(ListSet [Card],ListSet [Card])不符合预期的类型(Pile,Pile)',但是很简单:

type Pile = ListSet[Card]
桩体内部解决了问题.. 我真的应该使用类型别名和extend关键字? (我真的很想创建一个新类,而不只是给它一个别名)

ps:我的构造函数看起来像疯了吗?这是我能搞清楚的唯一方法

1 个答案:

答案 0 :(得分:2)

问题在于splitAt会返回ListSet[Card],这不是桩,尽管您Pile延伸ListSet[Card]

避免此问题的一种方法是将结果从splitAt转换为Pile

def draw(amount: Int = 1): (Pile, Pile) = {
  val (a,b) = this.splitAt(amount)
  (new Pile(a), new Pile(b))
}

另一个想法。

您只想返回Pile以使draw方法可用于结果。你可以在这里使用隐式类。现在ListSet[Card]的所有实例都有draw方法。

implicit class Pile(cards: ListSet[Card]) {
  def draw(amount: Int = 1) = cards.splitAt(amount)
}

小例子。

type Card = Int

val pile = ListSet(1,2,3,4,5)

val (drawn, remaining) = pile.draw()

val (nextDrawn, nextRemaining) = remaining.draw(2)