2012-09-10 10 views
5

Creo que es más fácil mostrarlo con un ejemplo.scala: prevent companion Objeto de la definición oculta de la clase original

Digamos que tengo una clase caso Condiciones, con un objeto Condición compañero utiliza para proporcionar una constructora alternativa, como esto:

case class Condition(
    field: String, 
    values: List[String]) 
} 

object Condition { 
    def apply(field: String, value: String): Condition = { 
    Condition(field, List(value)) 
    } 
} 

Cuando la importación desde otro me sale el siguiente aviso (que con el tiempo se vuelve en un error):

import utils.query.Condition 

[warn] [...]/ConditionBuilder.scala:14: imported `Condition' is permanently hidden by definition of object Condition in package query 
[warn] import utils.query.Condition 
[warn]  ^
[warn] one warning found 

quiero tener acceso a la clase de condición, cuando declargin el tipo de una variable, y al objeto de compañía, al ejecutar uno de los métodos es

¿Hay alguna manera de lograr esto y evitar esta advertencia (aparte de cambiar el nombre del objeto complementario, por supuesto)?

+0

¿Qué versión del compilador de Scala está utilizando? –

+0

¿Puedo preguntar si la condición se define en la consulta del paquete por casualidad? En este caso, simplemente suelte la importación y listo. –

+0

Estoy usando el compilador scala que viene con los juegos 2.0: Bienvenido a Scala versión 2.9.1.final (Java HotSpot (TM) 64-Bit Server VM, Java 1.7.0_06). – opensas

Respuesta

2

hasta el momento ahora, la solución que encontré es la importación de la siguiente manera:

import utils.query 

[...] 

val myCondition: query.Condition 

y la advertencia se ha ido, pero yo creo que debe haber una mejor solución ...

1

lo que usted describe ISN la forma en que funciona (o proporciona una muestra completa).

Parece un entorno de compilación obsoleta. ¿Hubo objetos del paquete involucrados en algún punto? Haga una compilación limpia, reinicie el compilador residente y llámenos por la mañana.

Por ejemplo, una cláusula de importación de importación p. {X => y} cambia el nombre del p.x termname a la termname Y y el nombre del tipo p.x al nombre del tipo y. (SLS 4,7)

Pero hay una gran comentario en el código alrededor de la intersección de las clases de casos y sus compañeros, que incluye este comentario divertido entre los diez primeros:

// What exactly this implies and whether this is a sensible way to 
// enforce it, I don't know. 

No estoy diciendo que la el comentario tiene una influencia necesaria en su caso, pero es una gran línea.

0

tuve una clase principal con el nombre Server y yo estaba creando un servidor embarcadero en la clase principal de la siguiente manera:

 import org.eclipse.jetty.server.Server 

    var server:Server=new Server() 

Tengo el siguiente advierten sobre la ejecución de sbt run

[warn] /home/xxx/xxx/xxx/src/main/scala/com/xxx/xxx/main/Server.scala:3: imported `Server' is permanently hidden by definition of object Server in package main 
    [warn] import org.eclipse.jetty.server.Server 
    [warn]        ^
    [warn] one warning found 

Cambié el nombre de mi clase principal y la advertencia desapareció.

Cuestiones relacionadas