2011-12-23 9 views
7

Estoy escribiendo un trait protegida que debe especificar el método clone devolver un CloneResult, así como:Scala: Especificar método público de primer orden método

trait TraitWithClone extends Cloneable { 
    def clone: CloneResult 
} 

La intención aquí es para apretar el tipo de retorno de java.lang.Object ' s clone() a algo útil para esta interfaz. Sin embargo, cuando intento compilar esto, me sale:

error: overriding method clone in trait View2 of type()CloneResult; method clone in class Object of type()java.lang.Object has weaker access privileges; it should be public; (Note that method clone in trait View2 of type()CloneResult is abstract, and is therefore overridden by concrete method clone in class Object of type()java.lang.Object)

¿Cómo puedo exigir que una aplicación sea public, cuando Scala no tiene la palabra clave? Sé que puedo hacer:

trait TraitWithClone extends Cloneable { 
    override def clone = cloneImpl 
    protected def cloneImpl: CloneResult 
} 

... pero eso parece un truco. ¿Alguna sugerencia?

+0

¿El clon 'def anulación(): CloneResult' trabajar? –

+0

No; eso fue lo primero que intenté. –

+0

con el paréntesis? –

Respuesta

4

Aquí está la parte importante del mensaje de error: "y, por lo tanto, se reemplaza por el método concreto clonar en clase Objeto".

Debe proporcionar una implementación del método clone en su rasgo. No es ideal, pero es lo que debe hacer ya que clone es un método concreto en Object.

trait TraitWithClone extends Cloneable { 
    override def clone: CloneResult = throw new CloneNotSupportedException 
} 

Aunque, por lo general que acaba de hacer este tipo de cosas en su clase concreta directamente:

class Foo extends Cloneable { 
    override def clone: Foo = super.clone.asInstanceOf[Foo] 
} 

scala> new Foo 
res0: Foo = [email protected] 

scala> res2.clone 
res1: Foo = [email protected] 
Cuestiones relacionadas