2010-01-27 5 views
8

Je travaille sur un projet Scala qui importe deux bibliothèques Java. Grâce à une mauvaise planification, les deux bibliothèques Java ont des noms de paquets similaires, l'un avec com sur le devant, l'autre sans. Le problème est que Scala est à la recherche du paquet avec com à l'avant, et me dit que le paquet n'existe pas. Si je supprime toutes les références à la bibliothèque avec com devant le paquet, la compilation fonctionne.Scala import java package app com

Pour montrer un exemple qui est logique:

En foo.jar nous avons un paquet company.product.core

En bar.jar nous avons un com.company.product.other paquet.

Si les deux pots sont sur le chemin de classe, la ligne:

import company.product.core.ClassName 

échoue avec l'erreur « valeur fondamentale n'est pas membre du paquet com.companyname.product » Si nous supprimons bar.jar, la compilation fonctionne bien. Est-ce que Scala essaie de me sauver de taper com.?

Y at-il un moyen de lui dire d'importer seulement ce que je lui dis?

Répondre

11

Utilisez le préfixe _root_ dans les instructions d'importation. Cela rend la résolution du paquet absolue.

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

En vous référant à votre commentaire: avec des importations relatives vous pourriez faire quelque chose comme ça. Cela vous évite de taper du texte.

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

Cela fonctionne, mais je suis curieux de savoir pourquoi Scala fait cela? – Jeff

+0

Scala active une correspondance relative d'une importation de package antérieure. Comme, après "import scala.collection._" vous pouvez simplement appeler "import mutable._" pour obtenir "scala.collection.mutable._". Il provoque beaucoup de choses amusantes avec le nom du paquet "net". –

+0

@Tristan import collection._ fonctionne aussi (scala est déjà importé) –

4

Je suppose que l'endroit où vous mettez cette ligne d'importation appartient à un paquet commençant par « com. », comme ceci:

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

Cela signifie que tous com., y compris com.company, fait partie de l'étendue, et que com.company est, par conséquent, en observant le company qui est racine, car les objets plus proches dans la portée de la hiérarchie sont les plus éloignés.

Pour tout ce que ça vaut, Scala 2.8 aura des règles légèrement différentes. Maintenant, si je définis mon paquet comme:

package com.c.b.a 

alors que a sera portée. Si je souhaite obtenir le comportement précédent, je dois faire:

package com 
package c 
package b 
package a