2012-09-10 53 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 

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