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.
Công cụ 'JavaSuperClass.JavaInnerClass' có hoạt động không? –
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