При использовании экзистенциальных типов в Scala кажется, что компилятор указывает на то, что каждое использование экзистенциального объекта является другим параметром типа, даже если они на самом деле одинаковы.Несоответствие типа Scala, неспособное вывести T =: = T
Для простой надуманный пример - Учитывая следующий код
class Box[T](value:T){
def get:T = value
def contains(check:T):Boolean = value == check
}
я могу сделать следующее
val b1 = new Box(1)
b1.contains(b1.get)
Однако при использовании экзистенциальных типов ...
val b2 : Box[_] = new Box(1)
b2.contains(b2.get)
Я получаю следующая ошибка (In scala 2.11.7
[error] /private/tmp/exttest/test.scala:53: type mismatch;
[error] found : (some other)_$6(in value b2)
[error] required: _$6(in value b2)
[error] b2.contains(b2.get)
Мое предположение заключалось в том, что компилятор понимает, что тот же параметр типа _$6
используется в обоих случаях, однако он, кажется, теряет следы и рассматривает их как отдельные типы.
Я принципиально недопонимаю что-то о экзистенциальных типах, или это ошибка в компиляторе Scala - и если да, то есть ли оптимальная практика для ее работы?
Это в значительной степени эквивалентно наличию 'def содержит (check: Any)' – ghik
Хм, да, я думаю, ваше решение более надежное. –