无法在com.a.y.x中访问包x中的类SomeClass

时间:2014-02-06 00:11:49

标签: scala scala-2.10 scalac

我正在尝试解除几个Java类的IoC并直接在一些Scala代码中加载它们。当然,我发现像

这样的包之间存在名称空间冲突
com.a.x.SomeClass

com.a.y.x.SomeClass

我尝试过使用像

这样的导入名称空间解析器
import com.a.y.x.{ SomeClass => YYYSomeClass }
import com.a.x{ SomeClass => XXXSomeClass }

清理导入,但是稍后在类中引用这些类会将错误显示为Typesafe ScalaIDE中的悬停,以及清除编译后的错误。

当我从gradle scala插件编译时,或通过带有scala 2.10.2或2.10.3的Typesafe ScalaIDE编译时,我得到以下类型的无用错误消息:

class SomeClass in package x cannot be accessed in com.a.y.x

如果我尝试使用com.a.y.x中没有名称空间冲突的类,则会出现问题。如果我尝试一些scalac标志,我也能得到一个稍微不同的警告(在typer阶段):

class SomeClass in package x cannot be accessed in y.this.x

我真的想知道是否有办法扩展第一个包引用。我在设置Eclipse项目以调试scalac编译器时遇到问题,而且我没有找到一个scalac标志,可以为错误添加有用的信息。

当我尝试ctx.getBean("someClass").asInstanceOf[XXXSomeClass]new XXXSomeClass时会发生错误。

来自警告的this参考使我认为存在一些对象混淆。我不认为这是我正在处理的大型项目中的类路径问题,因为删除一个jar会删除解析导入的能力,但是我无法在单独的项目中使用简单的示例类重现它。

关于java类的更多信息 - 不同的,冲突的java包位于由1.6风格的Java编译的独立jar中。它们是顶级的公共类,尽管两个是带有私有构造函数的单例和相应的公共静态getInstance()方法。

1 个答案:

答案 0 :(得分:1)

这确实是一个访问错误。我认为这只是一个糟糕的错误信息。 java是单独编译的,可以从jar文件中访问。我没有足够重视我想要实例化的类的package private性质(我曾在其中一些人面前看到“公开”,并没有仔细检查所有这些)。在这种情况下,名称空间冲突是一个红色鲱鱼,实际上不会影响错误消息的输出。

在某些情况下,我可以使用公共接口而不是Spring-glue来实例化对象并将它们加载到Scala类中。

如果scalac错误消息的格式为:

,则会更有帮助
class SomeClass in package com.a.y.x cannot be accessed in totally.unrelated

其中第一个包引用是Java类的包,而尾随包是Scala类试图实例化Java类的包。

回顾一下 - Java类就像:

package com.a.y.x.SomeClass

class SomeClass extends SomeOtherClass implements SomeInterface

并且需要像:

package com.a.y.x.SomeClass

public class SomeClass extends SomeOtherClass implements SomeInterface

不会出现这些访问错误。

由于我在这里有更多的Scala控制权,我一时兴起尝试将Scala类的包从totally.unrelated更改为com.a.x.y,然后将其编译得干净利落。正如您可能猜到的那样,仅仅将错误推迟到运行时错误 - > java.lang.IllegalAccessError。但是,来自Java的IllegalAccessError具有我认为应该在scalac的编译错误中发生的描述/包顺序:

...java.lang.IllegalAccessError: tried to access class com.a.y.x.SomeClass from class s.Trouble$delayedInit$body