2011-05-25 35 views
1

我有以下情况:类型定义的Java类在Scala代码继承

我有一个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] { //... } 

不编译和引发以下错误:

type arguments [org.bar.MyModel] do not conform to trait FooTrait's type parameter bounds [T <: org.foo.some.GenericModel]

此外,我不能调用的org.foo.some.Model任何方法,也没有的org.foo.some.GenericModeljavaModel

javaModel.doSomething() 

提高

value create is not a member of org.bar.MyModel

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

有没有办法从Scala代码中访问层次结构?

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

+0

FooClass扩展FooTrait吗?你的代码示例当然不会这么说。 – 2011-05-25 21:08:05

+0

您应该提供一个编译示例。你的问题并没有显示什么包'公共类模型扩展org.foo.some.GenericModel'定义在...对我来说,它似乎应该在* your *包中定义'org.bar'并且有'public class MyModel扩展org.bar.Model'。 – huynhjl 2011-05-26 07:02:26

+0

谢谢,这个问题缺少了一些重要的观点:'org.foo.some.GenericModel'和'org.foo.some.Model'都不在我的范围之内,并且与'org.bar.MyModel'不同。 ; 'FooClass'扩展了'FooTrait [MyModel]'。 – 2011-05-26 07:24:35

回答

0

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

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

+0

我使用的IDEA和事情看起来很好。现在你提到它很难,我会​​仔细检查构建过程。 – 2011-05-26 08:39:47

+0

双重检查,问题不在eclipse或IDEA中。当重新编译没有类型重定义的框架代码时,事情工作得很好。 – 2011-05-30 06:48:14