Я спросил earlier question, на который я получил отличный ответ. В комментариях Трэвис упомянул, что сравнение двух s не будет работать напрямую, но сопоставление шаблонов может использоваться для сравнения одного и того же класса.Scala: Разрешение двусмысленных типов для соответствия шаблону
sealed abstract class HandValue[T <: HandValue[T]](val rank: Int) extends Ordered[T]
case class HighCard(high: Int) extends HandValue[HighCard](0){
def compare(that: HighCard) = this.high - that.high
}
case class TwoPair(high: Int, big: Int, sm: Int) extends HandValue[TwoPair](2) {
def compare (that: TwoPair) = { ... }
}
В попытке поиска по шаблону ниже, у меня есть ошибка во время компиляции, что я подозреваю, должен сделать с помощью HandValue[_]
. val h1: HandValue[T <: HandValue[T]]
, аналогично тому, как был объявлен тип, недействителен. Есть ли способ решить эти проблемы?
val ans = sessions count {
hands: (Hand, Hand) => {
val h1: HandValue[_] = handValue(hands._1)
val h2: HandValue[_] = handValue(hands._2)
(h1, h2) match { // <-- Line as source of error
case _ if h1.rank > h2.rank => true
case (a: HighCard, b: HighCard) => a > b
case (a: TwoPair, b: TwoPair) => a > b
// etc..
}
}
}
Edit: Ошибка компиляции время:
error: type arguments [_$3] do not conform to class HandValue's type parameter bounds [T <: euler.solutions.p54.HandValue[T]]
(h1, h2) match {
Edit 2: Как упоминалось в this question, используя Type[_]
не будет работать.
Какова ошибка времени компиляции? – pedrofurla
Ах, извините, хороший звонок! Я забыл вставить его. – Louis
Кстати, какова связь между Hand и HandValue? – pedrofurla