Scala импорт Java-пакет дополняет ком - PullRequest
8 голосов
/ 27 января 2010

Я работаю над проектом Scala, который импортирует две библиотеки Java. Из-за плохого планирования две библиотеки Java имеют одинаковые имена пакетов, одна с передней частью com, другая без.

Проблема в том, что Scala сначала ищет пакет с com впереди и говорит, что пакет не существует. Если я удаляю все ссылки на библиотеку с com перед пакетом, компиляция работает.

Чтобы показать пример, который имеет смысл:

В foo.jar у нас есть пакет company.product.core

В bar.jar у нас есть пакет com.company.product.other.

Если оба банка находятся на пути к классам, строка:

import company.product.core.ClassName

Сбой с ошибкой "значение core не является членом пакета com.companyname.product" Если мы удалим bar.jar, компиляция будет работать нормально.

Скала пытается спасти меня от ввода com.? Есть ли способ заставить его импортировать только то, что я ему говорю?

Ответы [ 2 ]

11 голосов
/ 27 января 2010

Использовать префикс _root_ в операторах импорта. Это делает разрешение пакета абсолютным.

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

Ссылаясь на ваш комментарий: с относительным импортом вы можете сделать что-то вроде этого. Это в основном экономит время при наборе текста.

import _root_.company.product.core
import ClassAFromCore
import ClassBFromCore
4 голосов
/ 27 января 2010

Я предполагаю, что место, куда вы помещаете эту строку импорта, принадлежит пакету, начинающемуся с "com.", например:

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

Это означает, что все com., включая com.company, является частью области, и что com.company, следовательно, затеняет company, который является корневым, поскольку объекты, расположенные ближе в области иерархии, затеняют те, что находятся .

Для чего бы то ни было, в Scala 2.8 будут немного другие правила. Теперь, если я определю свой пакет как:

package com.c.b.a

, тогда only a будет в области видимости. Если я хочу получить предыдущее поведение, мне нужно сделать:

package com
package c
package b
package a
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...