(используя Скала 2.11.12)
Почему это компилируется?
sealed trait Inner
sealed trait Outer {
sealed trait I extends Inner
}
case object OuterA extends Outer {
case object Inner1 extends I
case object Inner2 extends I
}
case object OuterB extends Outer {
case object Inner1 extends I
}
class Data[O <: Outer](outer: O, inner: O#I)
// I expected this not to compile but it actually does
val data = new Data(OuterA, OuterB.Inner1)
Почему это не компилируется?
sealed trait Inner
sealed trait Outer {
type I <: Inner
}
case object OuterA extends Outer {
sealed trait OuterAInner extends Inner
override type I = OuterAInner
case object Inner1 extends OuterAInner
case object Inner2 extends OuterAInner
}
case object OuterB extends Outer {
sealed trait OuterBInner extends Inner
override type I = OuterBInner
case object Inner1 extends OuterBInner
}
class Data[O <: Outer](outer: O, inner: O#I)
// I expected this to compile but it actually does not
val data = new Data(OuterA, OuterA.Inner1)
// type mismatch;
// found : com.transparencyrights.ermine.model.V1.OuterA.Inner1.type
// required: ?#I
// Note that Inner1 extends Any, not AnyRef.
// Such types can participate in value classes, but instances
// cannot appear in singleton types or in reference comparisons.
// val data = new Data(OuterA, OuterA.Inner1)
Чего я хочу добиться, так это уникального конструктора Data
, который принимает два аргумента, Outer
и Inner
, с типом Inner
, ограниченным подтипом Inner
, зависящим от данного экземпляра Outer
.