Javaクラスから継承するScalaクラスを作成しています。保護されたJava内部クラスを継承するメソッドをオーバーライドする必要があります。パラメータ。 Javaの依存関係は、ソースコードなしのjarとして提供されます。Javaから継承するときの保護された内部クラスの参照方法(バイトコードのみ)
私はhttps://issues.scala-lang.org/browse/SI-3120にあるものとまったく同じ設定ですが、私はJavaソースコードを利用できないので、scalacはバイトコード(jarまたはクラスファイル内)を見てJava依存性しか知りません。
これは私が何をしようとしている基本的には次のとおりです。
// 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")
}
}
は、私はJavaの日JDK 1.6.0_24ホットスポットがあり、ScalaはLinux上で2.9.0.1。これは何が起こるかです:私は、これは一般的な"protected static inner class" Java-compatibility issue in Scalaに非常によく似た音を知っているが、私はこれを信じる:
ScalaSubClass.scala:6: error: method method overrides nothing
override def method(javaInnerClass: JavaInnerClass) {
^
one error found
注:
$ 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
注、私はJavaSuperClass#JavaInnerClass
単にJavaInnerClass
を変更した場合、私はこれを取得します私の例のどこにも統計がないので、関係はありません。
私は何かが間違っているように感じます。私は同じコードをEclipseの混合java/scalaプロジェクトに入れたときにコンパイルするように見えました(後者はJavaInnerClass
構文)。それは、私がそれを動作させることができないJavaバイトコード(およびJavaソースコードなし)だけでScalaコードをコンパイルするときだけです。私はちょうどJava内部クラスを参照する正しい構文が完全に不足していますか、これは既知の欠陥ですか、それともコンパイラのバグを報告するべきですか?この正確なユースケースについて私の検索では何も見つかりませんでした。
'JavaSuperClass.JavaInnerClass'は機能しませんか? –
いいえ、「type JavaInnerClassはオブジェクトjavapkg.JavaSuperClassのメンバーではありません」と言われています – Mike