Проблема неявных преобразований в scala 2.8

Я хочу записать неявное преобразование Tuple2 [A, B] к Seq[C], где C является супер типом и A и B. Моя первая попытка как следующее:

implicit def t2seq[A,B,C](t: (A,B))(implicit env: (A,B) <:< (C,C)): Seq[C] = {
    val (a,b) = env(t)
    Seq(a,b)
}

Но это не работает:

scala> (1,2): Seq[Int]
<console>:7: error: type mismatch;
 found   : (Int, Int)
 required: Seq[Int]
       (1,2): Seq[Int]
       ^

В то время как эти работы:

class Tuple2W[A,B](t: (A,B)) {
    def toSeq[C](implicit env: (A,B) <:< (C,C)): Seq[C] = {
        val (a,b) = env(t)
        Seq(a,b)
    }
}
implicit def t2tw[A,B](t: (A,B)): Tuple2W[A,B] = new Tuple2W(t)

Вариант использования:

scala> (1,2).toSeq
res0: Seq[Int] = List(1, 2)

Я понятия не имею, почему первое решение не работало как ожидалось. Версия 2.8.0.r22634-b20100728020027 Scala (Java HotSpot(TM) Client VM, Java 1.6.0_20).

8
задан Eastsun 2 August 2010 в 16:40
поделиться

1 ответ

Вам нужно использовать только <: <, если параметры, которые должны быть ограничены, уже связаны в окружающей области (как во второй попытке), поэтому в вашем случае

implicit def t2seq[A <: C,B <: C,C](t: (A,B)) = Seq(t._1, t._2)

будет достаточно.

Я предполагаю, что ваша первая попытка не сработала, поскольку она слишком сложна для модуля вывода типов.

9
ответ дан 5 December 2019 в 18:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: