2011-06-25 8 views
11

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内部クラスを参照する正しい構文が完全に不足していますか、これは既知の欠陥ですか、それともコンパイラのバグを報告するべきですか?この正確なユースケースについて私の検索では何も見つかりませんでした。

+0

'JavaSuperClass.JavaInnerClass'は機能しませんか? –

+0

いいえ、「type JavaInnerClassはオブジェクトjavapkg.JavaSuperClassのメンバーではありません」と言われています – Mike

答えて

1

Thisは、トピックを説明する優れた記事です。

EDIT-1

私の悪い、私はすぐに答えました。これは実際にはバグかもしれませんマイク、私はハックを見つけることができるかどうかを試しています。私が見つけたら教えてあげましょう。

EDIT-2

私は別のものを試してみたが、私はそれを動作させるための方法を見つけることができません。 Mike私はバグレポートを提出することをお勧めします。

+1

それを稼働させようとしてくれてありがとう、ちょうど私だけではないことを確認してくれてありがとう。私はここにバグを提出しました:https://issues.scala-lang.org/browse/SI-4737 – Mike

+0

マイクは問題ありません。巨人が何を考えるか見てみましょう;) –

関連する問題