3

我正在尝试取消 Spring IoC 几个 Java 类并将它们直接加载到一些 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.ayx 中没有名称空间冲突的类,则会出现问题。如果我尝试一些 scalac 标志,我也能够得到一个稍微不同的警告(在打字阶段):

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 包位于不同的 jar 中,这些 jar 由 1.6 版的 Java 编译。它们是顶级的公共类,尽管其中两个是具有私有构造函数和相应的公共静态 getInstance() 方法的单例。

4

1 回答 1

2

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

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

如果 scalac 错误消息具有以下形式,则会更有帮助:

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

其中第一个包引用是 Java 类的包,后面的包是尝试实例化 Java 类的 Scala 类的包。

回顾一下 - 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.unrelatedcom.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
于 2014-02-06T21:55:24.043 回答