例如類型,參數化的課,我有下面的類層次結構:使用默認類型參數
abstract class A {
def a() {}
def aa()
}
class B extends A {
def aa() {}
def b()
}
class C extends A {
def aa() {}
def c()
}
然後,我希望創建一個可以存儲這些類的實例的任意組合的集合類。它將能夠調用常用的方法。並且由於類型參數化,必須提供調用,如果在創建過程中參數化這些類類特定的方法的能力:
object Group {
def apply(as: Buffer[A]) = new Group[A](as)
def apply[T <: A](as: Buffer[T]) = new Group[T](as)
}
class Group[T <: A](as: Buffer[T]) {
def a() { as.map(_.a()) }
def aa() { as.map(_.aa()) }
}
所以Group
可以用默認創建的,這樣最通用的類型參數:
val groupA = Group(Buffer[A]())
groupA.a() //ok
groupA.aa() //ok
groupA.b() //error
groupA.c() //error
並與A
後裔的一個明確參數化時,它可以創建:
val groupB = Group[B](Buffer[B]())
groupB.a() //ok
groupB.aa() //ok
groupB.b() //ok
groupB.c() //error
一第二,如果可能的話,我想創建組時,以某種方式去除[B]
不必要的類型規範,因爲它可以從傳遞的緩衝區類型中提取:
val groupB = Group(Buffer[B]())
什麼是實現這一點的正確方法功能?可能嗎?也許有更好的架構決定來實現這一目標?
更新:這裏的代碼是僞代碼,我只是不知道如何寫我想要的東西。
更新2:我想,調用類型特定的方法,如b()
或c()
應通過映射來實現:
groupC.as.map(_.c())
其是僅可能,如果類型參數化是正確的。這更接近我的想法,但實現的確切方式仍然是一個謎(除了一堆asInstanceOf
東西的用法)..
也許使用'Group [C]'的隱式轉換爲具有'c()'方法的東西,它只適用於參數爲「C」的情況? – ziggystar
@ziggystar:也許,但你能舉個例子嗎?我不確定我能否像那樣把握它。 – noncom