可以說我有一些密封類Scala的方法取決於類型的密封參數
sealed abstract class SomeEnumThing {
type RenderedType
}
object Type1 extends SomeEnumThing {
type RenderedType = String
}
object Type2 extends SomeEnumThing {
type RenderedType = Array[Byte]
}
而且我想的方法基於傳入的參數定義的抽象類型返回,如
def render(something : SomeEnumThing) : something.RenderedType = { .... }
這是什麼正確的語法。這甚至是可能的,我認爲這與2.10方法相關的類型有關。
編輯:更新了例
sealed abstract class SomeThing {
type RenderedType
}
object Type1 extends SomeThing {
type RenderedType = String
}
object Type2 extends SomeThing {
type RenderedType = Long
}
def render(something : SomeThing) : something.RenderedType =
something match {
case Type1 => "test"
case Type2 => 0l
}
你的問題是,你想要案例匹配來介紹新型知識,它並沒有在你的情況。使用GADT和依賴類型時,這可能很容易發生,但在您的情況下不會發生。幸運的是,Scala支持GADT的一個相當絕對的概念,並且你的類型同構於一個類型,所以你可以改變你的'SomeThing'到'SomeThing [A]'並且'Type1 extends SomeThing [String]'並且'Type2 extends SomeThing [龍]'。然後用'render [A](something:SomeThing [A]):你的大小寫塊就會起作用。 – 2013-04-24 21:55:52
因此,你的意思是編譯器不會確定Type1中唯一可能的返回值是一個字符串,這恰好是該情況下RenderedType的值。它可以,如果它足夠聰明,但Scala編譯器還沒有。 – monkjack 2013-04-24 22:05:56
是的,它是那些想要做的更「依賴」的事情之一。在我的例子中,案例匹配是有效的,但我並不太相信它的實現(如果你將兩個類型變量平等,例如,它不能正確工作,或者如果你對精化類型變量有差異註釋) 。如果你真的想開始做這樣的事情,你可能需要將你的代碼從頭開始,並在'SomeThing'上定義消費/消除函數。 – 2013-04-24 22:09:15