【问题标题】:How to define a trait with methods accepting any subtype of a particular trait如何使用接受特定特征的任何子类型的方法来定义特征
【发布时间】:2015-01-21 02:33:54
【问题描述】:

我有两个特点

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,其方法将接受扩展AppModel的任何类T的参数并返回T 并且任何扩展I 的类都可以具有完全接受T 类作为参数的方法(而不是AppModel 的任何其他类R

我该怎么办?

【问题讨论】:

    标签: scala methods parameters overriding traits


    【解决方案1】:

    试试这个

    
    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 } }

    【讨论】:

    【解决方案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
    }
    

    【讨论】:

    • 这很干净并且有效。谢谢。所以我想可以使用多种类型以及type T&lt;: Model1 type U &lt;: Model2 等等?
    猜你喜欢
    • 2014-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多