如何在其方法中使用泛型参数定义特征,然后使用特定的类型参数覆盖?
一个例子:
import shapeless._
case class UserA(name:String)
case class UserB(name:String)
trait User {
def save(item:Option[T]): Option[T]
}
class UserAdmin extends User {
def save(item:Option[UserA]): Option[UserA]
}
class UserSomethingElse extends User {
def save(item:Option[UserB]): Option[UserB]
}
Run Code Online (Sandbox Code Playgroud)
有了这个,我得到了错误,not found: type T即使它是无形的
如果你沿着这些方向做某事就行了:
trait User[T] {
def save(item:Option[T]): Option[T]
}
class UserAdmin extends User[UserA] {
def save(item: Option[UserA]): Option[UserA] = ???
}
...
Run Code Online (Sandbox Code Playgroud)
除了 @mfirry 之外的另一个选项是,我们使用类型成员(而不是类型参数)。
trait User {
type T
def save(item:Option[T]): Option[T]
}
class UserAdmin extends User {
type T = UserA
def save(item:Option[UserA]): Option[T]
}
class UserSomethingElse extends User {
type T = UserB
def save(item:Option[UserB]): Option[T]
}
Run Code Online (Sandbox Code Playgroud)
在我的实际情况中,这实际上更好,因为我有几种这样的类型,它们的具体实现在子类中会有所不同(参数和返回参数的类型不同)。所以像这样:
trait User {
type T
type R
def save(item:Option[T]): Option[R]
}
class UserAdmin extends User {
type T = UserA
type R = UserAA
def save(item:Option[T]): Option[R]
}
class UserSomethingElse extends User {
type T = UserB
type R = UserBB
def save(item:Option[T]): Option[R]
}
Run Code Online (Sandbox Code Playgroud)
本文很有帮助:http://www.artima.com/weblogs/viewpost.jsp ?thread=270195