Я пытаюсь параметризовать некоторые методы с параметрами очень общего типа.
В качестве примера, в REPL я сначала определяю:
trait Term
case class FunctionalTerm[+T <: Term](t: T) extends Term
Интуитивно следующий метод принимает Term и FunctionalTerm и возвращает что-то с типом наименьшей верхней границы типа переданного термина и типом аргумента FunctionalTerm:
def ex1[T1 <: Term, T3 <: X, FunctionalTerm[T1] <: X, X <: R, R <: Term](t1: FunctionalTerm[T1], s: T3): R = sys.error("TODO")
Пока все хорошо в REPL.
Затем я определяю ex2
как вспомогательную функцию, которая выполняет ту же операцию, что и ex1
, но с переставленными входными аргументами:
def ex2[T2 <: Term, T3 <: X, FunctionalTerm[T2] <: X, X <: R, R <: Term](s: T3, t2: FunctionalTerm[T2]): R = ex1(t2,s)
Попытка определить ex2
в REPL выдает следующую ошибку:
error: inferred type arguments [T2,T3,FunctionalTerm,T3,T3] do not conform to method ex1's type parameter bounds [T1 <: Term,T3 <: X,FunctionalTerm[T1] <: X,X <: R,R <: Term]
ex1(t2,s)
^
error: type mismatch;
found : FunctionalTerm[T2]
required: FunctionalTerm[T1]
ex1(t2,s)
^
error: type mismatch;
found : T3(in method ex2)
required: T3(in method ex1)
ex1(t2,s)
^
error: type mismatch;
found : R(in method ex1)
required: R(in method ex2)
ex1(t2,s)
^
Я потратил около двух дней, пытаясь найти решение, и теперь полностью застрял. В гугле больше ничего не могу найти.
Поскольку список аргументов типа ex2
такой же, как и у ex1
, но с переставленными местами T1
и T2
, я не Не понимаю, это неправильно, или как это исправить.
Мы будем очень признательны за любую помощь!
Обновление
Наименьшие верхние границы были отвлекающим маневром. Пример можно перегнать дальше.
Следующие две функции могут быть определены в REPL без ошибок:
def ex1[T1 <: Term, FunctionalTerm[T1] <: Term](t1: FunctionalTerm[T1]): Term = sys.error("TODO: ex1")
def ex2[T2 <: Term, FunctionalTerm[T2] <: Term](t2: FunctionalTerm[T2]): Term = ex1(t2)
Введение дополнительного параметра X
, по-видимому, вызывает проблему. Я могу определить в REPL следующее:
def ex3[T1 <: Term, FunctionalTerm[T1] <: X, X <: Term](t1: FunctionalTerm[T1]): Term = sys.error("TODO: ex3")
Но попытка последующего определения:
def ex4[T2 <: Term, FunctionalTerm[T2] <: X, X <: Term](t2: FunctionalTerm[T2]): Term = ex3(t2)
дает ошибку:
error: inferred type arguments [T2,FunctionalTerm,Nothing] do not conform to method ex3's type parameter bounds [T1 <: Term,FunctionalTerm[T1] <: X,X <: Term]
def ex4[T2 <: Term, FunctionalTerm[T2] <: X, X <: Term](t2: FunctionalTerm[T2]): Term = ex3(t2)
^
error: type mismatch;
found : FunctionalTerm[T2]
required: FunctionalTerm[T1]
def ex4[T2 <: Term, FunctionalTerm[T2] <: X, X <: Term](t2: FunctionalTerm[T2]): Term = ex3(t2)
^
Итак, я думаю, возникает вопрос: Почему параметр X
не используется в подпись имеет такой эффект?