8
假設我有:斯卡拉:使用類型參數或抽象類型,類型限制
class Bounded[A] {
type apply[C <: A] = C
}
這編譯:
implicitly[Bounded[Any]#apply[String] =:= String]
這種失敗:
type Str = Bounded[Any]#apply[String]
...有:
[error] /home/grant/Workspace/scunits/test/src/main/scala/Box.scala:37: type arguments[String] do not conform to type apply's type parameter bounds [C <: A]
[error] type Str = Bounded[Any]#apply[String]
[error] ^
我嘗試使用抽象類型而不是類型參數,結果相同。我發現的唯一解決方法是實例化類型。這將編譯:
val boundedAny = new Bounded[Any]
type Str2 = boundedAny.apply[String]
不幸的是,我用不具有性能方面的原因運行時間的情況下,往往幻影類型的工作。
爲什麼Scala會在這裏產生編譯錯誤?有更好的解決方法嗎?
感謝您的任何幫助。
更新:除了下面的解決方法,我需要一種方法來覆蓋具有抽象類型邊界的類型。我這樣做,像這樣:
object Test {
class AbstractBounded[A] {
type apply[C <: A] <: A
class Workaround[C <: A] {
type go = apply[C]
}
}
class Bounded[A] extends AbstractBounded[A] {
type apply[C <: A] = C
}
type Str = Bounded[Any]#Workaround[String]#go
}
謝謝,這個bug對我來說是很多挫折的源頭。 – Grant 2014-10-14 23:38:09