如何使用接受特定特征的任何子类型的方法来定义特征

时间:2014-11-23 08:12:12

标签: scala methods parameters override traits

我有两个特质

trait AppModel {}
trait ModelOperations {
  def get(model: AppModel): Option[AppModel]
  def create(model: AppModel): Boolean
}

并实施了课程

class User extends AppModel {
  val id = "xyz"
  val name = "abc"
}

class UserOperations extends ModelOperations {
   override def get(user: User) : Option[User] = {
    // get a new user object by filtering existing parameters
    return None
   }
   override def create(user: User): Boolean = { 
      // do something
      return false
   }
}

但是当我尝试编译时,我会收到method get overrides nothingmethod create overrides nothing错误

我打算做的是:声明一个接口I,其接口可以接受扩展T并返回AppModel的任何类T的参数。 任何扩展I的类都可以使用完全接受类T作为参数的方法(而不是R的任何其他类AppModel

我该怎么做?

2 个答案:

答案 0 :(得分:3)

试试这个


trait AppModel {}
trait ModelOperations {
  def get[T<:AppModel](model: T): Option[T]
  def create[T<:AppModel](model: T): Boolean
}

class User extends AppModel { val id = "xyz" val name = "abc" }

class UserOperations extends ModelOperations { override def get[User](user: User) : Option[User] = { // get a new user object by filtering existing parameters return None } override def create[User](user: User): Boolean = { // do something return false } }

答案 1 :(得分:2)

您可以使用带有边界的type字段,您可以在具体实现中进行优化。这是一个例子

trait AppModel
trait ModelOperations {
  type T <: AppModel
  def get(model: T): Option[T]
}

class User extends AppModel

class UserOperations extends ModelOperations {
  type T = User
  def get(user: User): Option[User] = None
}