2010-01-27 59 views
8

我正在導入兩個java庫的Scala項目。通過糟糕的規劃,這兩個java庫有類似的軟件包名稱,一個在前面,一個在沒有。Scala導入java包附加com

問題是,斯卡拉正在尋找前面的com包,並告訴我,該包不存在。如果我在包前使用com刪除對庫的所有引用,則編譯將起作用。

要說明的是有道理的例子:

在foo.jar中,我們有一整套company.product.core

在bar.jar,我們有一整套com.company.product.other。

如果兩個罐是在類路徑,行:

import company.product.core.ClassName 

與誤差「值核心不包com.companyname.product的成員」如果我們除去bar.jar,編譯失敗工作正常。

是斯卡拉試圖拯救我從鍵入COM。?有沒有辦法告訴它只導入我告訴它的內容?

回答

11

在導入語句中使用_root_前綴。它使得包的分辨率絕對。

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

引用評論:用相對進口你可以做這樣的事情。它基本上可以節省您一些打字。

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

這種方法,但我很好奇,爲什麼斯卡拉這樣做? – Jeff 2010-01-27 16:43:29

+0

Scala支持從以前的軟件包導入進行相對匹配。就像在「import scala.collection._」之後,你可以調用「import mutable._」來獲得「scala.collection.mutable._」。它使用「net」包名稱導致很多有趣的事情。 – 2010-01-27 17:04:31

+0

@Tristan導入collection._作品也(斯卡拉已經導入) – 2010-01-27 17:57:26

4

我猜你把進口線的地方屬於包裝開始「com.」,像這樣:

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

這意味着所有的com.,包括com.company,是部分因此,com.company因爲會隱藏作爲根的company,因爲更接近層次結構範圍的對象會將這些對象映射到更遠處。不管它有什麼價值,Scala 2.8都會有不同的規則。現在,如果我定義我的包爲:

package com.c.b.a 

然後只有a將在範圍之內。如果我希望得到以前的行爲,我需要這樣做:

package com 
package c 
package b 
package a