Давайте настроим условия выдачи
trait Bound
class T1[B <: Bound]
class WrapperT1[B <: Bound, T2[B2 <: Bound] <: T1[B2]](val t: T2[B])
class WrapperT2[HB <: Bound, B <: HB, T2[B2 <: HB] <: T1[B2]](val t: T2[B])
Проблема возникает, когда я определяю метод автоматического ввода типа аргумента для WrapperT2
.
def autoInferedMethod[B <: Bound, T2[B2 <: Bound] <: T1[B2]](arg: WrapperT1[B, T2]): Unit = Unit
def notAutoInferedMethod[HB <: Bound, B <: HB, T2[B2 <: HB] <: T1[B2]](arg: WrapperT2[HB, B, T2]): Unit = Unit
// Works
autoInferedMethod(new WrapperT1[Bound, T1](new T1[Bound]))
// Works
autoInferedMethod(new WrapperT1(new T1[Bound]))
// Doesn't works
notAutoInferedMethod(new WrapperT2[Bound, Bound, T1](new T1[Bound]))
// Compilator errors
no type parameters for method notAutoInferedMethod: (arg: ex.Q2.WrapperT2[HB,B,T2])Unit exist so that it can be applied to arguments (ex.Q2.WrapperT2[ex.Bound,ex.Bound,ex.T1])
[error] --- because ---
[error] argument expression's type is not compatible with formal parameter type;
[error] found : ex.Q2.WrapperT2[ex.Bound,ex.Bound,ex.T1]
[error] required: ex.Q2.WrapperT2[?HB,?B,?T2]
[error] notAutoInferedMethod(new WrapperT2[Bound, Bound, T1](new T1[Bound]))
[error] found : ex.Q2.WrapperT2[ex.Bound,ex.Bound,ex.T1]
[error] required: ex.Q2.WrapperT2[HB,B,T2]
[error] notAutoInferedMethod(new WrapperT2[Bound, Bound, T1](new T1[Bound]))
Я должен это исходит от
[HB <: Bound, ..., T2[B2 <: HB] <: ...]
Но я понятия не имею, почему, и если существует обходной путь, любая помощь в понимании этой проблемы приветствуется.
Обновление, похоже, работает на 2.13, но не 2.11 / 2.12