Scala композиция родовых типов - PullRequest
0 голосов
/ 27 июня 2019

У меня сложный вариант использования обобщенного типа, который был упрощен ниже

trait A
class AB extends A{
  val v = 10
}

trait X[T<:A]{
  def request: T
}

class XY extends X[AB]{
  def request = new AB()
}
class Test extends App{

  /**
    * X[A]
    * X[AB]
    * XY[A]
    * XY[AB]
    */
  def test[C<:A, D <: X[C]](t:Int)(input: D): Unit ={
    print(input.getClass.getName)
  }
  implicit val req = new XY()
  test(2)(req)

}

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

Error:(33, 7) inferred type arguments [XY] do not conform to method test's type parameter bounds [D <: X[Nothing]] test(2)(req)

Это синтаксически законно? Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 27 июня 2019

Nothing в ошибке компиляции обычно означает, что некоторый тип не был выведен.

Попробуйте явно указать параметры типа

test[AB, XY](2)(req)

Общий вывод вложенных типов работает с arity-2, но не с карри

1 голос
/ 27 июня 2019

Компилятор не может определить тип C в 2 этапа с определением, подобным этому.

Так что либо попросите компилятор сделать это за 1 шаг, указав D и C в определении аргумента input:

def test[C <: A, D <: X[C]](t: Int)(input: D with X[C]): Unit

Или неявное свидетельство для D <: X[C], которое поможет компилятору сделать вывод C в 2 этапа:

def test[C <: A, D <: X[_]](t: Int)(input: D)(implicit ev: D <:< X[C]): Unit
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...