Я пытаюсь определить «неизменные свойства сеттера» и общие функции для них.Scala - характеристики соответствия шаблону, которые имеют «self type», как аргумент типа, дают непроверенное предупреждение
У меня есть рабочая реализация, но я немного обеспокоен «непроверенными» предупреждениями из соответствия шаблонов. Я не совсем уверен, что я могу с этим поделать.
type Point = (Double, Double)
trait Sizable[A] {
this: A =>
def size: Point
/* immutable object value setter, returns a new of the same object*/
def size(point: Point): A with Sizable[A]
}
def partitionToSizable[T](elements: List[T]):
(List[T], List[T with Sizable[T]]) =
elements.foldLeft((List[T](), List[T with Sizable[T]]()))((p, c) =>
c match {
case a: T with Sizable[T] => (p._1, p._2 ++ List(a))
case a => (p._1 ++ List(a), p._2)
})
Приведенный выше код демонстрирует проблему.
Я даже не уверен, насколько велика проблема в том, что T не отмечен, поскольку все элементы в списке будут иметь тип T, а точка соответствия шаблонов не определяет, является ли этот тип T, поскольку мы уже знаем это.
Теоретически Sizable всегда будет иметь тип T из-за подписи его закрывающей функции.
Если у вас нет другого решения, я бы хотя бы хотел подавить предупреждение. @unchecked аннотации, похоже, не подавляют предупреждение.
Если я изменить случай с: T с Sizable [T] случаю а: Sizable [_] не будет компилироваться, так как тип результата, очевидно, не подтверждают Т.
ClassTags или TypeTags может решить но я подозреваю, что они действительно не нужны. (также может иметь служебные издержки производительности и TypeTags не работают с Scala.js)
Зачем вам такое сложное определение Sizeable? Это напоминает мне определение одиночного связанного списка. –
@ Антон Данилов, что вы имеете в виду? Это не список, он предоставляет общий, общий интерфейс для создания нового неизменяемого экземпляра с одним изменением свойства. Кроме того, речь идет не о Sizable, это просто пример концепции. Если вы знаете какой-нибудь лучший метод для этого, я бы воспринял это как ответ. –
Вам известно о копировании класса case? Это более общая и мощная альтернатива тому, что я считаю «размерным». – Simon