Как стать автором
Обновить

Комментарии 11

Если мне не изменяет память, подобная функциональность не была реализована намеренно.
https://docs.scala-lang.org/tour/variances.html


Если ошибаюсь — поправьте, я только учусь :)

Кажется variance это не совсем связанная с сабжем вещь
Связанная. В Scala есть definition side variance, у вместо неё use site variance.
Связанная. В Scala есть definition side variance, у вместо неё use site variance.


Связанная. В Scala есть definition side variance, у Java вместо неё use site variance.
Если смешивать две в системе типов сильно рисковано, а в системе вывода типов (inferece) — тем более.

Кстати, заглавие статьи содержит ошибку. Пример не ломает систему типов, а систему вывода(inference) типов. Последняя — по определению является попыткой компилятора угадать какой тип там должен был быть и компилятор не может всегда угадывать.
Я, кстати, увидел, где вы работаете, и начинаю понимать ваш поинт. Не очень понял зачем только заходить с раздачи минусов, если из ссылки выше он вообще не следует. Но спасибо хоть за такое объяснение)
Минус не я поставил.
Наоборот, я рад когда люди задают вопросы которые позволяют показать отличия в дизайне между языками.
Окей,
Начнем с того, что не вместо, в Scala есть как declaration-site variance: class Foo[+A], так и use-site variance: def someMethod[T <: Bar](foo: T)

Рассматриваемая проблема в том, что при вызове метода def test[A <: Gen[T], T](a: A), T без явного указания инферится в Nothing. Это чистый declaration-site, который есть и в Java — замените <: на extends.

Вопрос: причем здесь вообще use-site?
вставил UPD в пост
Ну что, в Kotlin всё нормально…
fun main(args: Array<String>) {
    val genInt = GenInt(42)
    val i = GenTest.test(genInt)
}
У меня хорошие новости: оригинальный пример работает в новом компиляторе для Scala: Dotty.

Заголовок спойлера
$ dotr
Starting dotty REPL...
Welcome to Scala.next (pre-alpha, git-hash: 54d7089) (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_45).
Type in expressions to have them evaluated.
Type :help for more information.
scala> object TestFail extends App {
val genInt = new GenInt(42)
val i = GenTest.test(genInt)
}
defined module TestFail

scala>

In Dotty we hope

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации