如果你真的,真的不希望把一個類型參數上Wrapper
,您可以用較少的丟三落四apply
推出自己的假案例類:
trait Thing {
type Out
def get: Out
}
abstract class Wrapper(t: Thing) extends Thing
object Wrapper {
def apply(t: Thing): Wrapper { type Out = t.Out } =
new Wrapper(t) {
type Out = t.Out
def get: Out = t.get
}
}
def hey(t0: Thing): t0.Out = Wrapper(t0: Thing { type Out = t0.Out }).get
(在現實生活中,你會還想要定義案例類給你的所有其他東西 - 有用的平等等)
問題是當定義一個case類時自動生成的Wrapper.apply
只返回Wrapper
,這意味着編譯器已經全部丟失有關其Out
的靜態信息。如果您編寫自己的apply
,則可以通過將返回類型設置爲指定Out
的優化類型來保留該信息。
爲了證明它的工作原理:
scala> val myThing = new Thing {
| type Out = String
| def get = "foo"
| }
myThing: Thing{type Out = String} = [email protected]
scala> hey(myThing)
res0: myThing.Out = foo
scala> val foo: String = hey(myThing)
foo: String = foo
所以編譯器能夠跟蹤的事實Out
是String
一路過關斬將。
使用'def hey(t:Thing):Thing#Out = Wrapper(t).get'適用於我 – GClaramunt
這個編譯,但它不比cast更好。>嘿(new Thing {type Out = Int; def get = 1}) res2:事情#出= 1 所以你沒有得到一個有用的靜態類型 –