在Object类的Scala方法克隆可以不在中Access访问到不允许的,因为保护的方法克隆(Sca

2019-08-20 02:49发布

我有在斯卡拉克隆烦恼。 这是可能克隆任意类型T的对象? 事情是这样的:

import collection.immutable.Stack

object Tester extends App {
  trait Grand[T <: Cloneable] {
    val stack = Stack[T]()
    val h: T

    def snapshot() {
      stack push h.clone().asInstanceOf[T]
    }
  }
}

但它抛出:
阶:类对象的方法克隆不能T中访问
访问受保护的方法克隆不允许的,因为前缀T型不符合特质在大测试对象在访问发生

错在那里?

Answer 1:

有人建议我在这个问题上。 在这种情况下,最好的办法是使用结构类型:

trait Grand[T <: {def cloneObject: T}]

这样用户代码可能如下:

case class Person(name: String) {
  def cloneObject = copy()
}

object Roll extends App with Grand[Person] {
...
}


Answer 2:

克隆()从java.lang.Object继承不是来自java.lang.Cloneable。 可复制的,只是一个标记接口。

什么你可能想不工作,因为实现了Cloneable不会强制执行者与公众一个覆盖保护Object.clone()。

见http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#clone()和http://docs.oracle.com/javase/7/docs/api/java /lang/Cloneable.html

LN结论:不,它是不可能克隆任意类型T1的对象。 但是,您可以克隆类型T2的任何对象,其中T2是通过一种与克隆()的公共覆盖约束。 你的榜样失败,因为Object.clone()是受保护的,即只能从一个子类中调用。



文章来源: Scala method clone in class Object cannot be accessed in T Access to protected method clone not permitted because
标签: scala clone