我想使用大小写对象的类型作为抽象类型。我很惊讶地看到(类似)的代码编译如下:如何具体设置绑定类型的抽象类型?
sealed abstract class Bar
case object BarOne extends Bar
case object BarTwo extends Bar
sealed abstract class Foo {
type A <: Bar
def f: A
}
object Foo {
object FooOne extends Foo {
type A = BarOne.type
val f = BarTwo
}
object FooTwo extends Foo {
type A = BarTwo.type
val f = BarOne
}
}
在我的真实的例子Foo
被参数化,并作为案例类。所以我不能只让A
成为一个类型参数。
f = BarTwo
如何编译时,A
设置为BarOne.type
?
如果A
在f: A
被解释为A <: Bar
,为什么会这样呢?
有没有一种方法可以为Foo
的每个对象实例具体设置A
?
我正在使用Scala 2.11.8。
更新:,当我在FooOne
& FooTwo
编译与def attributeType = ...
替换val attributeType = ...
失败(如预期)。
在'FooOne'失踪'延伸Foo'和'FooTwo'一个错字?因为如果添加它,它不会编译。 –
@EndeNeu这是一个疏忽。你是对的,它不会编译(如预期)。我已经更新了这个问题,使它看起来尽可能接近实际的代码。当然这是没有用的,因为上面的代码没有编译,我的代码编译。 – muhuk
@muhuk如果上面的代码没有编译,那么它不代表你的编译代码。除非你得到一个正确的最小例子,否则这个问题是无法回答的。 – Daenyth