【发布时间】:2019-12-11 02:11:48
【问题描述】:
(使用 Scala 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实例。
【问题讨论】:
标签: scala generics inner-classes path-dependent-type