【问题标题】:Get case object from Scala Object从 Scala 对象获取案例对象
【发布时间】:2016-01-04 18:38:00
【问题描述】:

如何从java类访问CALL_INDEX对象:

MyStrategy.scala

trait CallStrategy 
object CallStrategy {
  case object CALL_INDEX extends CallStrategy 
}

trait MyStrategy { def random(as: CallStrategy) } 

object MyStrategy extends MyStrategy 
{
   def random(as: CallStrategy) = { //Some code }
}

在另一个 scala 文件中,我可以使用以下命令访问 CALL_INDEXCallStrategy.CALL_INDEX

但在java中,我无法按如下方式访问它:

StrategyUser.java

CallStrategy$ callStrategy = CallStrategy$.MODULE$;
MyStrategy$ myStrategy = MyStrategy$.MODULE$;
myStrategy.random(callStrategy); // compile time error

上面的java代码给出编译时错误:

The method random(CallStrategy) in the type MyStrategy$ is not applicable for the arguments (CallStrategy$)

我通过以下方式使用了上面的 java 代码:

How do I "get" a Scala case object from Java?

更新:

请看下图进行说明:

即使我在代码中又添加了两条语句,但仍然出现相同的编译时错误:

【问题讨论】:

    标签: java scala


    【解决方案1】:
    CallStrategy callStrategy = CallStrategy$.MODULE$.CALL_INDEX$.MODULE$
    

    您当前的代码根本没有提到CALL_INDEX:它相当于Scala 中的MyStrategy.random(CallStrategy)

    【讨论】:

    • 现在谈谈你的说法:当我使用CallStrategy$.MODULE$.,然后按Control + Space 时,CALL_INDEX$ 没有下拉菜单。我还是打了。我写了完整的语句,它给出了编译时错误:CALL_INDEX$ cannot be resolved or is not a field。我正在使用Eclipse IDE,它显示了当我们按下Control + Space时要选择的方法。
    • MyStrategy.scala 文件在包中:com.test.user。所以我使用了以下导入语句:import com.test.user.CallStrategy$;。我输入了半语句CallStrategy callStrategy = CallStrategy$. 并按下键Control + SpaceCALL_INDEX$ 出现在下拉列表中。我选择了它。然后我再次按下 Control + Space。现在我从下拉菜单中得到了MODULE$。我选择了它。现在完整的声明是:CallStrategy callStrategy = CallStrategy$.CALL_INDEX$.MODULE$;。仍然编译时错误:cannot convert from CallStrategy$.CALL_INDEX$ to CallStrategy.
    • 我不确定尽管当我按下Control + Space 时 Eclipse 给了我可供选择的列表,但我在编写这些语句时遇到了编译时错误。但是,我在使用时没有收到任何错误:CallStrategy$ callStrategy= CallStrategy$.MODULE$;
    • 您需要获得CallStrategy,而不是CallStrategy$。您确定您在之前的评论中使用CallStrategy callStrategy = CallStrategy$.CALL_INDEX$.MODULE$; 得到了错误吗?如果您有CallStrategy callStrategy = CallStrategy$.CALL_INDEX$;,则此错误消息会更有意义。
    • CallStrategytrait CallStrategy 的类型; CallStrategy$object CallStrategy 的类型。因此,如上所述,使用对象作为参数调用 MyStrategy.random 是没有意义的。
    【解决方案2】:

    您应该执行以下操作:

    MyStrategy$.MODULE$.random(CallStrategy.CALL_INDEX$.MODULE$);
    

    在您的代码中,您尝试从 CallStrategy 对象访问 CALL_INDEX,而是在 CallStrategy 接口中可用。

    更新 1:(完整代码)

    MyStrategy.scala:

    trait CallStrategy
    
    object CallStrategy {
      case object CALL_INDEX extends CallStrategy
    }
    
    trait MyStrategy {
      def random(as: CallStrategy)
    }
    
    object MyStrategy extends MyStrategy {
      def random(as: CallStrategy) = {
        println(as)
      }
    }
    

    StrategyUser.java:

    public class StrategyUser {
        public static void main(String[] args) {
            MyStrategy$.MODULE$.random(CallStrategy.CALL_INDEX$.MODULE$);
        }
    }
    

    仅供参考,我使用的是 scala 版本 '2.11.7' 和 java 版本 '1.7.0_75'

    【讨论】:

    • 无法将 CALL_INDEX$ 识别为字段或变量。您能否提供要使用的 scala 库,因为某些配置似乎不正确。我的项目有两个文件:一个 scala 文件和一个 java 文件。 Java文件是scala文件的调用方法。请参阅相关图片以获得更清晰的视图和项目结构。
    • 我可以按照上面的代码成功,没有任何问题。我正在使用 Intellij 以及提到的 scala 和 java 版本。这可能是eclipse的问题。你能提供你的eclipse版本和sbt插件版本吗?
    • 哦,是的,你是对的。我的 Eclipse Mars 在上面的代码中给出了CALL_INDEX$ 的编译时错误,但是当我运行StrategyUser.java 时,我得到了输出。这意味着问题只是 Eclipse 无法将 CALL_INDEX$ 识别为 scala 的字段或变量。我的eclipse scala版本也是2.11.7和java版本1.8.0_65。我的 sbt 版本也是sbt 0.13.8
    • 您还可以指出一些好的在线资源来掌握 Scala,因为我是新手。欢迎任何建议。谢谢!
    • 我发现以下系列教程非常有用:1.Neophyte's guide to scala。不要错过结帐2。Martin's course in Coursera
    猜你喜欢
    • 2011-02-03
    • 1970-01-01
    • 2016-11-16
    • 2012-05-15
    • 2019-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    相关资源
    最近更新 更多