Скажите, почему Scala говорит: «тип META имеет несовместимый тип» - PullRequest
1 голос
/ 14 августа 2011

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

trait Base[B <: Base[B]] {
    type META = Meta[B]
    def meta: META
}

trait Meta[B <: Base[B]]

trait EnumBase[B <: EnumBase[B]]
    extends Base[B] with Ordered[B] {
    override type META = EnumMeta[B]
}

trait EnumMeta[B <: EnumBase[B]]
    extends Meta[B] with Iterable[B]

И я получаю от компилятора Scala, что «тип META имеет несовместимый тип» в EnumBase.Это почему?EnumBase - это база, а EnumMeta - мета, поэтому EnumMeta [EnumBase] - совместим с мета [база] IMHO.

Ответы [ 2 ]

4 голосов
/ 14 августа 2011

Вы не можете переопределить элемент типа, который полностью установлен, вы можете наложить более жесткие ограничения на него (если тип был абстрактным, например, с type Meta <: Meta[B]), не обходясь без предыдущих ограничений вообще.

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

Что касается универсального элемента типа против элемента type, то это не совсем четкий вопрос, но я думаю, что тип type определенно лучше, когда он не отображается в публичном интерфейсе свойства, и в этом случае клиент не должен беспокоиться упомянуть об этом. Если это произойдет, (здесь в результате meta), я бы сначала рассмотрел дженерики.

3 голосов
/ 14 августа 2011

Используя это ...

trait Base[B <: Base[B]] {
    type META <: Meta[B]
    def meta: META
}

trait Meta[B <: Base[B]]

trait EnumBase[B <: EnumBase[B]]
    extends Base[B] with Ordered[B] {
    type META = EnumMeta[B]
}

trait EnumMeta[B <: EnumBase[B]]
    extends Meta[B] with Iterable[B]

... он компилируется, но я не уверен, что это то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...