我想使用大小寫對象的類型作爲抽象類型。我很驚訝地看到(類似)的代碼編譯如下:如何具體設置綁定類型的抽象類型?
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