scala:防止伴随Object隐藏原始类的定义

时间:2012-09-10 17:33:00

标签: scala companion-object

我认为通过示例更容易展示。

假设我有一个Condition case类,其中一个Condition伴随对象用于提供替代构造函数,如下所示:

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

我希望在执行变量类型时访问条件类型,并在执行其中一个方法时访问伴随对象

有没有办法实现这一点并避免此警告(当然,除了重命名伴侣对象之外)?

3 个答案:

答案 0 :(得分:2)

到目前为止,我找到的解决方法是这样导入:

import utils.query

[...]

val myCondition: query.Condition

并且警告消失了,但我认为应该有更好的解决方案......

答案 1 :(得分:1)

您描述的不是它的工作方式(或提供完整的样本)。

这听起来像一个陈旧的编译环境。包装对象是否涉及任何一点?做一个干净的编译,重启任何常驻编译器,并在早上给我们打电话。

  

例如,import子句导入p。{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.

我不是说评论对你的案子有任何必要的影响,但这是一条很好的路线。

答案 2 :(得分: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

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