2013-10-29 46 views
5

如果非要在java中階覆蓋Java類方法引用內部類

public class A 
{ 
    protected class B 
    { 
    } 

    protected void method(B b) {...} 
} 

定義下面的類,我想從它在Scala和重寫方法繼承。我本來希望做到以下幾點:

方法方法覆蓋什麼:

class C extends A { 

    override def method(b: B): Unit = { 
    // ... do something 
    super.method(b) 
    } 
} 

然而,當我這樣做,這樣給下面的錯誤Scala編譯器不喜歡。注意:C類的超類包含以下非最終成員名爲method:protected [package ...] def method(x $ 1:A#B):單元

我可以使其工作的唯一方法是做到以下幾點:

class C extends A { 

    override def method(b: A#B): Unit = { 
    // ... do something 
    super.method(b.asInstanceOf[this.B]) 
    } 
} 

我覺得有這樣做相當難看,想知道是否有這樣做的一個更合適的方法?

感謝

回答

1

明顯的代碼工作對我來說:

public class A { 
    public class B {} 
    protected void method(B b) { 
    System.out.println("A#method"); 
    } 
} 

class C extends A { 
    override def method(b: B): Unit = { 
    println("C#method") 
    super.method(b) 
    } 
} 

然後在SBT控制檯:

scala> new C 
res0: C = [email protected] 

scala> new res0.B 
res1: res0.B = [email protected] 

scala> res0.method(res1) 
C#method [email protected] 
A#method [email protected] 

然而,如果我再修改Ç .scala並獲取sbt來執行增量重新編譯,我收到你看到的錯誤(用0.12.4和0.13.0進行測試) - 可能值得爲此提供一個bug。

+0

這個問題似乎是與eclipse中的編譯器一起工作的。我用sbt對它進行了測試,它的確如你所說的那樣工作 - 事實上,它在eclipse中編譯的變化在sbt編譯中不起作用。我會進一步調查,試圖找出與日食的問題。 – user79074

+0

我猜測問題是在編譯器中,因爲它也發生在eclipse中。已經轉載了Scala 2.9.2和Scala 2.10.1。所以提交了一個scala lang項目的bug。 – user79074

+0

[SI-7946](https://issues.scala-lang.org/browse/SI-7946),適合那些在家玩的人。 – Hugh