包对象中的类型定义“劫持”scala代码中java类的继承

时间:2011-05-25 20:53:37

标签: java scala inheritance package

我有以下情况:

我有一个像这样的Java类层次结构:

package org.foo.some;
public class Model extends org.foo.some.GenericModel { // ... }

package org.bar;
public class MyModel extends org.foo.some.Model { // ... }

org.foo.some.Modelorg.foo.some.GenericModel不在我的范围内(不是我的代码)。在Scala中,我也无法实现:

package org {
  package foo {
    package object some {
      type Model = org.foo.some.ScalaModel
    }
  }
}

这会导致Scala代码中出现一种有趣的行为,例如

val javaModel:MyModel = new org.bar.MyModel()

trait FooTrait[T <: org.foo.some.GenericModel] { // ... }

class FooClass extends FooTrait[MyModel] { //... }

不编译并引发以下错误:

  

类型参数[org.bar.MyModel]不符合特质FooTrait的类型   参数bounds [T&lt ;: org.foo.some.GenericModel]

此外,我无法在org.foo.some.Model上调用org.foo.some.GenericModeljavaModel的任何方法:

javaModel.doSomething()

加注

  

value create不是org.bar.MyModel的成员

我的印象是包对象“劫持”Scala代码中Java类层次结构的可见性。实际上,ScalaModel并未延伸org.foo.some.GenericModel

是否有可能仍然可以从Scala代码中访问层次结构?

编辑:当我重新编译代码并删除类型重新定义时,一切正常。所以我认为我所看到的是一种“禁用”特定类的包级别类型定义的方法。

1 个答案:

答案 0 :(得分:0)

您是否使用GUI(特别是Eclipse)来构建项目?

这似乎与Scala trouble accessing Java methods有关(没有答案,但普遍的共识是问题不在于scala而在于Eclipse)。