2012-09-10 65 views
5

我認爲這個例子更容易展示。scala:防止伴侶對象隱藏原始類的定義

比方說,我有一個條件的情況下類,與使用條件同伴目的是提供一種替代的構造,就像這樣:

case class Condition(
    field: String, 
    values: List[String]) 
} 

object Condition { 
    def apply(field: String, value: String): Condition = { 
    Condition(field, List(value)) 
    } 
} 

當我從另一個導入它,我得到以下警告(這最終會變成爲錯誤):

import utils.query.Condition 

[warn] [...]/ConditionBuilder.scala:14: imported `Condition' is permanently hidden by definition of object Condition in package query 
[warn] import utils.query.Condition 
[warn]  ^
[warn] one warning found 

我想有機會獲得條件類型,declargin變量的類型時,和同伴對象,執行時它的一個方法

是否有某種方法可以實現這一點並避免此警告(當然,重命名伴隨對象除外)?

+0

您使用的是哪個版本的Scala編譯器? –

+0

我可以問一下,如果條件在包查詢中有定義嗎?在這種情況下,只需刪除導入即可完成。 –

+0

我正在使用帶有play 2.0.3捆綁的scala編譯器:歡迎使用Scala 2.9.1.final(Java HotSpot(TM)64位服務器VM,Java 1.7.0_06)。 – opensas

回答

2

至今,現在,我找到了解決方法是導入這樣的:

import utils.query 

[...] 

val myCondition: query.Condition 

,並警告走了,但我覺得應該有一個更好的解決辦法...

1

你描述的ISN它的工作方式(或提供完整的樣本)。

這聽起來像一個陳舊的編譯環境。是否在任何時候涉及包裝物件?做一個乾淨的編譯,重新啓動任何駐留編譯器,並在早上給我們打電話。

例如,導入子句導入第{X => Y}重命名termname p.x到termname y和類型名稱p.x到類型姓名Y。 (SLS 4.7)

但有在周圍情況下類及其同伴的交叉點,代碼,其中包括這個前十名的有趣評論大的評論:

// What exactly this implies and whether this is a sensible way to 
// enforce it, I don't know. 

我不是說了評論對你的案件有任何必要的影響,但這是一條很好的路線。

0

我有一個主類名Server和我創建以下列方式中的主類碼頭服務器:

 import org.eclipse.jetty.server.Server 

    var server:Server=new Server() 

我得到了下面的警告上運行sbt run

[warn] /home/xxx/xxx/xxx/src/main/scala/com/xxx/xxx/main/Server.scala:3: imported `Server' is permanently hidden by definition of object Server in package main 
    [warn] import org.eclipse.jetty.server.Server 
    [warn]        ^
    [warn] one warning found 

我重命名了我的主課程,警告消失了。