2011-05-25 60 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