Scala - 使用泛型方法定义特征

Sof*_*fia 0 generics scala

如何在其方法中使用泛型参数定义特征,然后使用特定的类型参数覆盖?

一个例子:

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即使它是无形的

mfi*_*rry 6

如果你沿着这些方向做某事就行了:

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)


Sof*_*fia 5

除了 @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