Почему этот код Scala не работает с typecheck?Почему аргументы типа не соответствуют уточнению типа?
trait T { type A }
trait GenFoo[A0, S <: T { type A = A0 }]
trait Foo[S <: T] extends GenFoo[S#A, S]
Я не понимаю, почему "аргументы типа [S # A, S] не соответствуют Черту ограничивающих параметров типа GenFoo в [A0, S <: T {типа A = A0}]". Есть ли работа?
Редактировать: Как было указано, ошибка соответствия проистекает из неявки S <: T{type A = S#A}
. Daniel Собрал указал на -explaintypes
, который говорит нам:
S <: T{type A = S#A}?
S <: T?
true
S specializes type A?
this.A = this.A?
S = this.type?
false
false
false
false
Я не уверен, как интерпретировать это.
Обратите внимание, что мы получим нелегальную циклическую ссылку, если мы попытаемся определить,
trait Foo[S <: T { type A = S#A } ] extends GenFoo[S#A, S]
хотя тип уточнения здесь, кажется, не добавить новую информацию. (Смотрите также Why is this cyclic reference with a type projection illegal?)
Моя мотивация создать признак Foo[S <: T]
, который специализируется на S#A
, как: How to specialize on a type projection in Scala? Для того, чтобы получить эту работу, я пытаюсь поверхности S#A
в качестве явного параметра A0
в реализации признака GenFoo
, которые могут быть специализированы непосредственно. Я надеялся применить идею уточнения типа от ответа Майлза Сабина до Why is this cyclic reference with a type projection illegal?, но я столкнулся с этой ошибкой соответствия.
Вы пробовали -explaintypes? –
Спасибо за указатель. Я обновил вопрос, чтобы включить вывод из -explaintypes. –