我有以下涉及類型參數和類型成員嵌套結構:從類型參數和類型成員聚集類型信息
trait B
trait B1 extends B
trait U {
type _B <: B
}
type U1 = U {
type _B = B1
}
class Q[_U <: U] {
override def toString() : String = {
// print out type information on B here...
}
}
def test() {
val q = new Q[U1]()
println(q.toString())
}
這似乎是不可能的我收集,因爲這樣U1在運行時B上的類型信息被指定。
我錯了嗎?如果不是的話,是否有一個解決方案,在設置上有微小的變化?
感謝來自Kipton巴羅斯的答案,我想出了以下設置:
trait B
trait B1 extends B
trait B2 extends B
trait U {
type _B <: B
implicit val mfB : Manifest[_B]
}
class U1 extends U {
type _B = B1
val mfB : Manifest[_B] = implicitly
}
class U2 extends U {
type _B = B2
val mfB : Manifest[_B] = implicitly
}
class Q[_U <: U](u : _U) {
override def toString() : String = {
"B: " + u.mfB.erasure.getName()
}
}
def test() {
println(new Q(new U1) toString)
println(new Q(new U2) toString)
}
這種方法唯一的缺點就是需要U.
的實例
謝謝,我更新了我的答案,以澄清你的觀點。你有沒有想過爲什麼我的例子中的case(4)會打印'Nothing'?這令我感到驚訝,因爲在呼叫站點的類型推斷確定類型參數「B」爲「B1」,是正確的嗎? –