所以这是这个Java问题到scala的一个相当直接的端口
我们有一堆采用通用参数的特征,如下所示:
trait Ident { }
trait Container[I <: Ident] {
def foo(id: I): String
}
trait Entity[C <: Container[I], I <: Ident] {
def container: C
def foo(id: I) = container.foo(id)
}
这可行,但有点笨拙,因为我们必须在定义实体的子类时提供 Ident 的类型和 Container 的类型。实际上,仅 Container 的类型本身就足够了类型信息:
class MyIdent extends Ident { }
class MyContainer extends Container[MyIdent] { }
class MyEntity extends Entity[MyContainer,MyIdent] { }
// ^^^^^^^ shouldn't really be necessary
使用存在类型可以避免 Entity 需要两个参数......但当然你以后不能引用它。
trait Entity[C <: Container[I] forSome { type I <: Ident }] {
def container: C
def foo(id: I) = container.foo(id)
// ^^^ complains it has no idea what 'I' is here
}
同样将事物转换为使用成员类型也不起作用......
trait Ident { }
trait Container {
type I <: Ident
def foo(id: I): String
}
trait Entity {
type C <: Container
def container: C
def foo(id: C#I) = container.foo(id)
// ^^ type mismatch
}
那么有谁知道 Scala 中是否有一个优雅的解决方案来解决这个问题?