例如类型,参数化的课,我有下面的类层次结构:使用默认类型参数
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