我正在尝试解除几个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()方法。
答案 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