Я пытаюсь скомпилировать следующий код:Scala - использование параметризованную типа внутри параметризованном типа
case class Settings(settingsList:List[Setting])
abstract class Setting[T](name:String, value:T)
но компилятор жалуется:
Error:(9, 54) class Setting takes type parameters
case class Settings(settingsList:List[Setting])
^
но эквивалентный код Java компилируется sucesfully:
public class Settings {
List<Setting> settingsList;
}
abstract class Setting<T> {
abstract T getValue();
abstract String getName();
}
В чем отличие Scala от такого поведения?
Мессинг с отклонениями не всегда является лучшей идеей. В зависимости от деталей реализации для настройки ковариация может не иметь смысла и ограничивает дизайн. Подстановочный знак выглядит как путь. –
@UlysseMizrahi Это не «беспорядок». Я рекомендую всегда аннотировать типы с отклонениями, где это имеет смысл. Так работает система, основанная на подтипах, и Scala предпочитает неизменные структуры данных, поэтому это имеет большой смысл. Если это невозможно, как я уже отмечал, вы можете использовать экзистенциальный (групповой) тип. –
«Так работает система, основанная на подтипах» - это просто неверно, и хотя ковариация действительно связана с неизменяемостью, принуждение ковариационных средств неспособно использовать тип в параметрах метода (что может быть желательно даже в неизменяемых структурах). Кроме того, дисперсия имеет фактическое значение с точки зрения типового дизайна. Мы хотим, чтобы параметр [Список [Int]] был настройкой [Итерируемый [Int]]? Это может не иметь смысла с дизайнерской точки зрения. –