所以这是scala 这个Java问题的一个相当直接的端口
我们有一堆特征采用通用参数,如下所示:
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)
}
Run Code Online (Sandbox Code Playgroud)
这有点工作,但它有点笨拙,因为我们必须在定义Entity的子类时提供Ident的类型和Container的类型.实际上,只有Container的类型就足够了类型信息:
class MyIdent extends Ident { }
class MyContainer extends Container[MyIdent] { }
class MyEntity extends Entity[MyContainer,MyIdent] { }
// ^^^^^^^ shouldn't really be necessary
Run Code Online (Sandbox Code Playgroud)
使用存在类型避免了实体需要采用两个参数......但是您当然不能在以后引用它.
trait Entity[C <: Container[I] forSome { type I <: Ident }] {
def container: C
def foo(id: I) = …Run Code Online (Sandbox Code Playgroud)