2013-10-29 17 views
5

Nếu tôi có các lớp sau đây được định nghĩa trong javascala override java phương pháp lớp tham chiếu đến lớp bên

public class A 
{ 
    protected class B 
    { 
    } 

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

Và tôi muốn kế thừa từ nó trong scala và phương pháp ghi đè. Tôi đã có thể hy vọng có thể làm như sau:

class C extends A { 

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

Tuy nhiên trình biên dịch scala không thích khi tôi làm theo cách này đưa ra các lỗi sau:

phương pháp phương pháp ghi đè gì cả. Lưu ý: các lớp siêu hạng C chứa các thành viên không phải là thành viên cuối cùng được đặt tên phương pháp: được bảo vệ [gói ...] def (x $ 1: A # B): Đơn vị

Cách duy nhất tôi có thể làm cho nó hoạt động là làm như sau:

class C extends A { 

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

Tôi thấy phải làm điều này khá xấu xí và tự hỏi liệu có cách nào để làm điều đó không?

Cảm ơn

Des

Trả lời

1

Mã rõ ràng làm việc cho tôi:

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) 
    } 
} 

Sau đó, trong SBT console:

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] 

Tuy nhiên, nếu tôi sau đó sửa đổi C .scala và nhận sbt để làm một biên dịch gia tăng, Tôi nhận được lỗi bạn thấy (thử nghiệm với 0.12.4 và 0.13.0) - nó có thể là giá trị nộp một lỗi sbt về việc này.

+0

Sự cố dường như liên quan đến trình biên dịch hoạt động từ trong nhật thực. Tôi đã thử nghiệm nó với sbt và nó hoạt động như mong đợi như bạn đã nói - trên thực tế, những thay đổi mà tôi đã thực hiện cho nó để biên dịch trong nhật thực không hoạt động bên trong một biên dịch sbt. Tôi sẽ điều tra thêm để thử và tìm ra vấn đề với nhật thực. – user79074

+0

Tôi đoán vấn đề là với trình biên dịch vì nó xảy ra từ trong nhật thực cũng vậy. Đã sao chép với scala 2.9.2 và scala 2.10.1. Vì vậy, đã nộp một lỗi với dự án scala lang. – user79074

+0

[SI-7946] (https://issues.scala-lang.org/browse/SI-7946), dành cho những người chơi cùng ở nhà. – Hugh

Các vấn đề liên quan