2017-02-13 15 views
1

(Scala 2.11.8)Высшие-добрее типы вывода

Рассмотрим следующий фрагмент кода:

class Case2 { 
    trait Container[+A] { 
    def addAll[B >: A, T2 <: Container[B]](that: T2): Boolean 
    } 

    def t1: Container[String] = ??? 
    def t2: Container[Int] = ??? 

    // Works 
    t1.addAll[Any, Container[Any]](t2) 

    // Errors: 
    //* type mismatch; found : Case2.this.Container[Int] required: T2 
    //* inferred type arguments [String,Case2.this.Container[Int]] do not conform to method addAll's type parameter bounds [B >: String,T2 <: Case2.this.Container[B]] 
    t1.addAll(t2) 
} 

Почему не может длиться addAll вывод вызова собственно не менее надтипу?

+1

Не ответ, но вам действительно нужен 'T2'? 'def addAll [B>: A] (что: Container [B]): Boolean' должен работать и больше похож на то, что вы обычно видите в подобной ситуации. –

+0

К сожалению, в реальном коде существуют ограничения типа, зависящие от 'T2', поэтому я не думаю, что это возможно. Фрагмент выше - это упрощение, которое я придумал, исследуя проблему в исходном коде. –

+0

Кажется, что вы, по сути, утверждаете, что 'Container [Int] <: Container [B]' где 'B>: String'. Если вы явно установите B в Any, он будет работать (как вы нашли), но я не думаю, что система вывода типов может заменить Any как «решение». Хотя я не уверен на 100%. – Phasmid

ответ

0

Создано ticket, который был закрыт как «из сферы» цитаты Adriaan Moors:

Тип вывод не поддерживает границы, которые относятся к другим параметрам типа.