首页 文章

有没有通用案例类或具有指定具有特定参数的复制方法的特征的任何方法?

提问于
浏览
2

嗨,所以我有这个用例,我有一个函数,它采用一种扩展特征的类型 . 让我们说特征是:

trait A {
   val a: Double
}

现在我有多个扩展a的case类 .

case class B(val a: Double) extends A 
case class C(val a: Double, val b: Double) extends A

现在我想要一个广义的功能,例如:

def change[T <: A](newA: Double, state: T): T = {
   state.copy(a = newA)
}

如果我可以指出通用T是一个扩展A的案例类,我可以推断出该状态有一个具有参数a的克隆方法 . 或者也许有一种方法可以定义一个泛型,它表示有一个克隆函数只有一个param是a .

谢谢

1 回答

  • 1

    Build 在cchantep的评论和similar question I have asked recently之后的作品:

    trait A[T <: A[T]] {
      val a: Double
      def clone(a: Double = a): T
    }
    
    case class B(a: Double) extends A[B] {
      def clone(a: Double = a) = copy(a = a)
    }
    
    case class C(a: Double, b: Double) extends A[C] {
      def clone(a: Double = a) = copy(a = a)
    }
    
    def change[T <: A[T]](newA: Double, state: T): T = {
      state.clone(a = newA)
    }
    

    是否有任何理由要求 change 返回特定类型而不仅仅是 A ?如果没有这个要求可能会简单得多,我添加了递归类型只是为了满足这个要求(描述 clone 总是返回原始类型):

    trait A {
      val a: Double
    
      def clone(a: Double = a): A
    }
    
    case class B(a: Double) extends A {
      def clone(a: Double = a) = copy(a = a)
    }
    
    case class C(a: Double, b: Double) extends A {
      def clone(a: Double = a) = copy(a = a)
    }
    
    def change(newA: Double, state: A): A = {
      state.clone(a = newA)
    }
    

    即使使用这个简单的实现,您也可以直接使用 clone 而不是 change ,它仍然会静态保留派生类型 . 尽管如此,我认为这样的要求没有多大意义,并且在编译器知道它是 BC 而不是 A 的情况下,你可以直接使用复制,只有当你只有 A 时才需要 change .

相关问题