LiftWeb не ковариантный тип в ячейке - PullRequest
0 голосов
/ 22 января 2012

Я имею дело с Cell , и у меня есть проблема, потому что они не являются ковариантными.Вот что я хочу сделать:

import net.liftweb.util.Cell

trait A {}
class AA extends A {}

trait T{
  val cell:Cell[A]
}

class U extends T{
  val cell:Cell[AA] = //implementation
}

У меня ошибка, потому что AA является потомком A, но не равен A.

Есть ли решение

Ответы [ 2 ]

2 голосов
/ 22 января 2012
  1. Из определения скалярного trait Cell [T] extends Dependent, Ячейка является не ковариантной

  2. val может переопределять без параметровметод, но не наоборот.

  3. Либо класс U должен быть абстрактным, либо определена cell функция.


ЕслиCell является ковариантным, с этими изменениями должен работать ваш пример.

scala> trait Cell[+T]
defined trait Cell

scala> trait A
defined trait A

scala> class AA extends A
defined class AA

scala> trait T { def cell: Cell[A] }
defined trait T

scala> class U extends T { override def val: Cell[AA] = new Cell[AA] {} }
defined class U
2 голосов
/ 22 января 2012

На самом деле, вы ошибаетесь.Ваша ошибка: «ошибка: переопределение ячейки значения в признаке T типа Cell [AA]; ячейка метода должна быть стабильным, неизменным значением: def cell: Cell [AA]».

Теперь, пока я могуПредложите, чтобы T принял параметр типа V <: A, а затем, чтобы функция cell () возвращала Cell [V], реальная проблема здесь даже не связана с генериками.В T ваша ячейка является членом данных.В U «клетка» является функцией.Компилятор просто хочет, чтобы вы выбрали один (и тот, который работает и имеет смысл, состоит в том, чтобы он был функцией в обоих местах, так что ... просто измените эту "val cell" на "def cell" и задайте один из тех 'ячейка определяет реализацию, и вы в порядке). </s>

Обновление (теперь, когда вопрос был исправлен):

Хорошо, так что, какВ моем исходном ответе предлагается, чтобы trait T принимала параметр типа для решения этой проблемы, например:

trait A {}
class AA extends A {}

trait T[V <: A]{
  val cell:Cell[V]
}

class U(inCell: Cell[AA]) extends {val cell = inCell} with T[AA]
...