2011-06-25 34 views
11

Tôi đang viết một lớp Scala để kế thừa từ một lớp Java và tôi phải ghi đè một phương thức có lớp bên trong Java được bảo vệ như một tham số. Sự phụ thuộc Java đến như một cái bình không có mã nguồn.Cách tham chiếu đến lớp bên trong được bảo vệ trong Scala khi kế thừa từ Java (chỉ với mã byte)

Tôi có cùng một thiết lập giống như được tìm thấy trong https://issues.scala-lang.org/browse/SI-3120 ngoại trừ việc tôi không có mã nguồn Java, do đó, scalac chỉ biết về sự phụ thuộc Java bằng cách xem mã byte (trong tệp jar hoặc lớp).

này về cơ bản là những gì tôi đang cố gắng để làm:

// javapkg/JavaSuperClass.java 
package javapkg; 
public class JavaSuperClass { 
    protected class JavaInnerClass { 
    } 
    public void method(JavaInnerClass javaInnerclass) { 
     System.out.println("hello"); 
    } 
} 

// scalapkg/ScalaSubClass.scala 
package scalapkg 
import javapkg.JavaSuperClass 
class ScalaSubClass extends JavaSuperClass { 
    override def method(javaInnerClass: JavaSuperClass#JavaInnerClass) { 
    println("world") 
    } 
} 

Tôi có Java Sun JDK 1.6.0_24 Hotspot và Scala 2.9.0.1 trên Linux. Đây là những gì sẽ xảy ra:

$ cd javapkg 
$ javac JavaSuperClass.java 
$ cd ../scalapkg 
$ scalac -cp .. ScalaSubClass.scala 
ScalaSubClass.scala:6: error: class JavaInnerClass in class JavaSuperClass cannot be accessed in javapkg.JavaSuperClass 
Access to protected class JavaInnerClass not permitted because 
prefix type javapkg.JavaSuperClass does not conform to 
class ScalaSubClass in package scalapkg where the access take place 
    override def method(javaInnerclass: JavaSuperClass#JavaInnerClass) { 
                ^
one error found 

Lưu ý, nếu tôi thay đổi JavaSuperClass#JavaInnerClass chỉ đơn giản là JavaInnerClass, tôi có được điều này:

ScalaSubClass.scala:6: error: method method overrides nothing 
    override def method(javaInnerClass: JavaInnerClass) { 
      ^
one error found 

Lưu ý: Tôi biết điều này nghe có vẻ rất giống với chung "protected static inner class" Java-compatibility issue in Scala, nhưng tôi tin rằng điều này không liên quan bởi vì không có số liệu thống kê nào trong ví dụ của tôi.

Tôi cảm thấy như có điều gì đó sai, bởi vì khi tôi đặt cùng một mã vào một dự án java/scala hỗn hợp trong Eclipse, nó có vẻ biên dịch tốt (với cú pháp JavaInnerClass sau); chỉ khi tôi biên dịch mã Scala với mã byte Java (và không có mã nguồn Java) mà tôi không thể làm cho nó hoạt động được. Tôi chỉ hoàn toàn mất tích cú pháp chính xác để tham khảo một lớp bên trong Java, đây có phải là một lỗi đã biết, hay tôi nên gửi một lỗi trình biên dịch? Tôi không thể tìm thấy bất kỳ điều gì về trường hợp sử dụng chính xác này trong tìm kiếm của tôi.

+0

Công cụ 'JavaSuperClass.JavaInnerClass' có hoạt động không? –

+0

Không, nó nói "loại JavaInnerClass không phải là một thành viên của đối tượng javapkg.JavaSuperClass" – Mike

Trả lời

1

This là một bài viết tuyệt vời thảo luận về chủ đề.

EDIT-1

xấu của tôi, tôi đã trả lời một cách nhanh chóng. Điều này thực sự có thể là một lỗi Mike, tôi đang cố gắng để xem nếu tôi có thể tìm thấy một hack xung quanh. Tôi sẽ cho bạn biết nếu tôi tìm thấy một.

EDIT-2

Tôi đã thử những thứ khác nhau nhưng tôi không thể tìm thấy một cách để làm cho nó hoạt động. Mike tôi muốn đề nghị bạn gửi một báo cáo lỗi.

+1

Cảm ơn bạn đã cố gắng để làm cho nó hoạt động và xác nhận nó không chỉ là tôi. Tôi đã gửi một lỗi ở đây: https://issues.scala-lang.org/browse/SI-4737 – Mike

+0

Không vấn đề gì Mike. Hãy xem những gì mà các đại gia nghĩ;) –

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