2010-01-27 14 views
8

Estoy trabajando en un proyecto de Scala que está importando dos bibliotecas de Java. Debido a una planificación deficiente, las dos bibliotecas de Java tienen nombres de paquete similares, uno con com en el frente y otro sin.Paquete de Scala import java que se agrega com

El problema es que Scala está buscando el paquete con com primero y diciéndome que el paquete no existe. Si elimino todas las referencias a la biblioteca con com en frente del paquete, la compilación funciona.

Para mostrar un ejemplo que tiene sentido:

En foo.jar tenemos un paquete de company.product.core

En bar.jar tenemos un com.company.product.other paquete.

Si ambos frascos están en la ruta de clase, la línea:

import company.product.core.ClassName 

falla con el error "núcleo valor no es miembro de com.companyname.product paquete" Si eliminamos bar.jar, la compilación funciona bien.

¿Scala está tratando de salvarme de escribir com.? ¿Hay alguna manera de decirle que importe solo lo que le digo?

Respuesta

11

Use el prefijo _root_ en los estados de importación. Hace que la resolución del paquete sea absoluta.

import _root_.company.product.core.ClassName 
import _root_.com.company.product.other.ClassName 

Comentario: con importaciones relativas, podría hacer algo como esto. Básicamente le ahorra algo de tipeo.

import _root_.company.product.core 
import ClassAFromCore 
import ClassBFromCore 
+0

Esto funciona, pero tengo curiosidad de por qué Scala hace esto? – Jeff

+0

Scala habilita una coincidencia relativa de una importación de paquete anterior. Al igual que, después de "importar scala.collection._", simplemente puede llamar a "import mutable._" para obtener "scala.collection.mutable._". Causa muchas cosas divertidas con el nombre del paquete "neto". –

+0

@Tristan import collection._ funciona también (scala ya está importado) –

4

voy a supongo que el lugar se pone esa línea de importación pertenece a un paquete que comienza con "com.", así:

package com.whatever 
import company.product.core.ClassName 

es decir, todas com., incluyendo com.company, forma parte del alcance, y que com.company está, por lo tanto, sombreando el company que es raíz, ya que los objetos más cercanos en el alcance de la jerarquía los sombrean más.

Para lo que sea, Scala 2.8 tendrá reglas ligeramente diferentes. Ahora bien, si defino mi paquete como:

package com.c.b.a 

entonces solamente a habrá en su alcance. Si deseo obtener el comportamiento anterior, tengo que hacer:

package com 
package c 
package b 
package a 
Cuestiones relacionadas