2011-02-17 68 views
7

在Java,Scala或通常任何JVM語言中,都有一組默認導入的包。例如,Java會自動導入java.lang,您不需要在Java代碼文件中執行此操作。添加默認包導入

現在我不知道哪個組件正好關心這個問題(編譯器?JVM?),但是有什麼方法可以讓其他包甚至默認導入類?

假設你有一個包定義了你在整個項目中使用的一組實用函數(例子可以是Scala中的scala.math),如果你能夠在每個數學相關類中跳過它的導入會很好。

+0

「如果您能夠跳過導入,這將非常棒」。爲什麼?現代IDE具有自動完成功能,並根據需要添加導入功能。此外,進口主要是爲其他程序員記錄代碼。如果缺少進口,程序員應該怎麼知道它使用了第三個附加類? – 2011-02-17 07:54:26

+1

在我看來,你的後一點應該是項目作者的決定。你可以寫關於這個問題的書籍,所以我想把它放在一邊。 關於第一點,真的,任何現代Java IDE都可以自動解析類名並添加導入。所以這可能只是一個與Scala相關的問題。在Scala(2.8)中,您可以擁有「包對象」,可以在包範圍上定義字段和方法。通過導入包(使用通配符),可以使這些定義可見,就好像它們是在正在使用的類中定義的一樣。目前沒有IDE支持我所知道的。 – pdinklag 2011-02-17 08:10:35

+0

@AndrewThompson,對我眼睛的鍋蓋阻礙=效率低下。 – Pacerier 2017-07-29 23:21:25

回答

12

從2.8開始,Scala擁有包對象,其內容會自動導入到包的每個文件中。創建一個名爲package.scala在你的包的頂層目錄(例如,x/y/z/mypackage)文件,並投入

package x.y.z 

package object mypackage { 
    ... 
} 

然後包對象中的任何定義自動導入(即,它是需要的任何import語句)到包中的任何文件xyzmypackage

你可以看看Scala的源代碼 - 做一個find dir -name package.scala - 有一堆它們,最頂層的爲scala定義隱式導入包本身,它們會自動導入到每個scala源文件中。

1

在Java中沒有辦法做到這一點。

+2

+1 ...(和謝天謝地沒有!) – 2011-02-17 07:48:36

11

Jim Balter提到了his answer(去給予好評吧)斯卡拉2.8 package object

任何類型的定義都可以放在類中,也可以放在包的頂層。如果您有一些幫助器方法,您希望整個包的範圍內,請繼續並將其放在包的頂層。

爲此,請將定義放入包對象中。每個包允許有一個包對象

斯卡拉實際上有它自己的scala package object
請參閱「Where to put package objects」。

因此,package對象可以解決給定包的顯式導入問題,但不能解決任何包的問題。
current limitations include

  • 首先,你不能定義或繼承包對象重載方法。
  • 其次,您不能在包對象中定義或繼承成員,該對象也是同一包中的頂級類或對象的名稱。

我們預計一些未來的Scala版本將會放棄這些限制。


原來的答覆:

在斯卡拉的一面,這樣的問題「should Scala import scala.collection.JavaConversions._ by default?」表明,你不能只是添加默認進口的Scala的用戶。
它必須得到語言的支持。

順便說一句,得到的結論是:

從斯卡拉專家觀點:讓我們讓事情變得簡單,限制了默認情況下導入到絕對最低的implicits。
Heiko Seeberger


Raphael做評論,但:

我想你可以寫自己的編譯器插件添加一些包?

果然,這個Scala article describe how to extend the Scala compiler
但支持的主要增加是:

  • 可以相添加到編譯器,從而增加了類型檢查結束後申請額外的檢查或額外的樹重寫。
  • 您可以告訴編譯器類型檢查信息有關打算應用於類型的註釋。

因此,即使一棵樹重寫(包括額外的進口),我不知道所說的重寫會在短時間內完成的類型和函數(由你所要求的隱含的進口參考)能夠正確分析。
但也許Scala Compiler Corner有更多的想法。從java.lang所有類的