Почему границы параметров типов игнорируются при использовании экзистенциальных типов в Scala? - PullRequest
3 голосов
/ 01 декабря 2010

Что я имею в виду:

scala> class Bounded[T <: String](val t: T)
defined class Bounded

scala> val b: Bounded[_] = new Bounded("some string")
b: Bounded[_] = Bounded@2b0a141e

scala> b.t
res0: Any = some string

Почему res0 имеет тип Any, а не String?Он наверняка может знать, что bt является по крайней мере строкой.Запись

val b: Bounded[_ <: String] = new Bounded("some string")

работает, но она избыточна по отношению к объявлению самого класса.

Ответы [ 2 ]

5 голосов
/ 01 декабря 2010

Сначала я отредактировал название вопроса.Вы не используете зависимые типы, которых в Scala нет, но экзистенциальные типы.Во-вторых, вы ничего не выводите, вы явно объявляете тип.

Теперь, если вы написали Bounded[Any], Scala не позволит вам.Однако одно из применений экзистенциальных типов заключается в том, чтобы иметь дело с ситуациями, когда параметр типа совершенно неизвестен, такими как необработанные типы Java, где.

Поэтому я предполагаю, что создание исключения в ситуации, которая кажетсядостаточно очевидное, что нарушит какую-то другую ситуацию, когда экзистенциальный тип является единственным способом справиться с чем-либо.

2 голосов
/ 01 декабря 2010

Недавно в списке рассылки было продолжительное обсуждение этой темы, Тип Граница "Stickyness" на символах подстановки .

Это не было окончательно, кроме как согласиться, что экзистенциальные типы, такие как Bounded[_] (сокращение от Bounded[$1] forSome { type $1 }), не поддаются интуиции.

@ extempore нашел один плюс в обсуждении:)

о плюсах я наконец то читаю Спекулятивное покрытие для покрытия. не имел представления полный текст песни "желтый" Подводная лодка "была в спецификации! Тем не менее, я должен признать, в контексте это было Трудно увидеть любой другой путь в этом разделе можно было бы написать.

...