Почему неизменный Набор Scala не является ковариантным в своем типе?

Сохранение последнего «принятого местоположения» объекта. Затем проверьте каждый новый объект Location и используйте его свойство «precision». Просто проверьте его, чтобы сравнить с предыдущим известным местоположением. Если точность повысилась, а адрес отличается, обновите принятый объект местоположения и сохраните его. Если точность хуже или адрес тот же, просто отбросьте его.

private Location currentLocation;

//inside Location Update Method
if(newLocation.getAccuracy() < currentLocation.getAccuracy()){
    currentLocation = newLocation;
    //update database location info
}
89
задан Eugene Yokota 15 December 2010 в 19:25
поделиться

2 ответа

Set является инвариантным в его параметре типа из-за понятия позади наборов как функции. Следующие подписи должны разъяснить вещи немного:

trait Set[A] extends (A=>Boolean) {
  def apply(e: A): Boolean
}

Если Set были ковариантными в A, apply метод не мог бы взять параметр типа A из-за контравариантности функций. Set мог потенциально быть контравариант в A, но это также вызывает проблемы, когда Вы хотите сделать вещи как это:

def elements: Iterable[A]

Короче говоря, лучшее решение состоит в том, чтобы сохранить вещи инвариантом, даже для неизменной структуры данных. Вы заметите это immutable.Map является также инвариантным в одном из его параметров типа.

53
ответ дан Daniel Spiewak 24 November 2019 в 07:21
поделиться

Править: для любого задающегося вопросом, почему этот ответ кажется немного вне темы, это вызвано тем, что я (корреспондент) изменил вопрос.

Вывод типа Scala достаточно хорош, чтобы выяснить желание CharSequences и не Строк в некоторых ситуациях. В частности, следующие работы для меня в 2.7.3:

import scala.collections.immutable._
def findCharSequences(): Set[CharSequence] = Set("Hello", "World")

Относительно того, как создать неизменный. HashSets непосредственно: не делать. Как оптимизация реализации, неизменная. HashSets меньше чем 5 элементов не являются на самом деле экземплярами неизменных. HashSet. Они - или EmptySet, Set1, Set2, Set3 или Set4. Эти классы неизменный подкласс. Набор, но не неизменный. HashSet.

5
ответ дан oxbow_lakes 24 November 2019 в 07:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: