小编Tom*_*ell的帖子

避免Scala中的冗余通用参数

所以这是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)

scala scala-generics

8
推荐指数
1
解决办法
317
查看次数

标签 统计

scala ×1

scala-generics ×1