Нет параметров типа для метода с хитрым старшим видом - PullRequest
1 голос
/ 17 апреля 2020

Давайте настроим условия выдачи

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

...