Scala 使用具体类型扩展列表集时出现的问题

Scala 使用具体类型扩展列表集时出现的问题,scala,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”方法中,

尝试在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:我的构造器看起来像疯子吗?这是我能找到它的唯一方法

问题是
splitAt
返回
ListSet[Card]
,这不是一堆,尽管您的
扩展了
ListSet[Card]

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

def draw(amount: Int = 1): (Pile, Pile) = {
  val (a,b) = this.splitAt(amount)
  (new Pile(a), new Pile(b))
}
另一个想法。

您只想返回
Pile
s,以便
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) 

我本打算提出同样的“另一个想法”,但我很懒。我只想补充一点,我建议在尝试从集合库中对某些内容进行子类型划分之前,先阅读scala库开发人员之间的这场辩论。