Тип уточнения - PullRequest
       6

Тип уточнения

1 голос
/ 06 ноября 2011

Как я могу сделать следующую работу?

trait T {
  type I <: T
  def apply(i: I): I
}

class Foo[T0 <: T](t: T0) {
  def bar(x: T0) = t(x)
}
implicit def tofoo[T0 <: T](t: T0) = new Foo(t)

Строка bar выдает ошибку:

type mismatch; found : x.type (with underlying type T0) required: Foo.this.t.I

(Можно спорить, почему сутенер и bar делаеттак же, как apply в T. Но это потому, что я уменьшил проблему. В моем рабочем коде у меня есть Seq [T] в качестве параметра bar.)

РЕДАКТИРОВАТЬ:

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

trait T {
  type I <: T
  def apply(i: I): I
}

class Foo[T0 <: T { type I = T0 }](val t: T0) {
  def bar(x: T0) = t(x)
  def test = "!"
}

implicit def tofoo[T0 <: T { type I = T0 }](t: T0) = new Foo(t)


trait TA extends T {
  type I = TA
}
case class TB() extends TA {
  def apply(i: I): I = i
}

println(TB().test) // ERROR: value test is not a member of TB

Ответы [ 2 ]

5 голосов
/ 06 ноября 2011

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

trait T {
  type I <: T
  def apply(i: I): I
}

class Foo[T0 <: T](t: T0) {
  def bar(x: T0) = t(x)
}

class TA extends T {
    type I = TB
    def apply(i: I): I = i
}

class TB extends T {
    type I = T
    def apply(i: I): I = i
}

val ta = new TA
val foo = new Foo(ta)
foo.bar(ta) // calls ta(ta)

Но ta.apply ожидает элемент типа TB, а не TA!

Так что, по сути, код, который вы написали, не отражает типовые отношения, которые у вас в голове.

1 голос
/ 06 ноября 2011
class Foo[T0 <: T {type I = T0}](val t: T0) { 
  def bar(x: T0) = t(x) 
}

implicit def tofoo[T0 <: T {type I = T0}](t: T0) = new Foo(t)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...