【问题标题】:Class is not visible unless I declare it in a package除非我在包中声明,否则类是不可见的
【发布时间】:2018-06-07 11:19:53
【问题描述】:

我在AppLoader.scala projectDir/app 中有一门课AppComponents

我的测试在projectDir/test/ControllerSpec/UserControllerSpec.scala

UserControllerSpec.scala 中,我尝试创建AppComponents 的实例,但编译器找不到AppComponents

override def components: BuiltInComponents = new AppComponents(context) //doesn't compile

但如果我在Apploader.scala 中包含语句package app,那么编译器能够找到AppComponents 并且上面的代码编译。

我不明白这种行为。

【问题讨论】:

    标签: scala intellij-idea scalatest playframework-2.6


    【解决方案1】:

    Top-level definitions outside a packaging are assumed to be injected into a special empty package. That package cannot be named and therefore cannot be imported. However, members of the empty package are visible to each other without qualification.

    所以AppComponents 应该只对其他类/特征/等可见。在一个包裹之外。因为

    如果我在 Apploader.scala 中包含语句包 app 则编译器能够找到 AppComponents

    看起来UserControllerSpec 确实声明了一个包,但看不到空包的成员。

    这种行为可能是为了与 Java 保持一致,请参阅Import package with no name Java 的答案。

    【讨论】:

    • 阿列克谢,你这个天才!是的。 UserControllerSpec 在一个包中!
    • 我要补充一点,我认为没有充分的理由不在 Scala 文件中包含包声明。在 Java 中你可能想要简化目录结构,但在 Scala 中你可以两者兼得。
    • 有一个有趣的副作用,我之前没有观察到。如果我在一个包中声明我的Apploader 类,那么显然我必须使用packagename.classname 访问它。后来我意识到了。我不得不将application.conf 中的条目更改为play.application.loader="app.AppLoader"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 2011-10-31
    • 1970-01-01
    • 2014-10-24
    • 1970-01-01
    相关资源
    最近更新 更多