0

次のようないくつかの抽象クラス定義を持つ scala を使用するプロジェクトを作成しました。

abstract class A(n: String) {
    require(n!= null)
    val name = n

    var inputs: List[Input[_]]
    var outputs: List[Output[_]]
}

abstract class B(n: String) extends A(n){  
   def act
   def isValid : Boolean
   def getCs : List[C[_]]
}

abstract class C[Type]{
   var value: Type 
}

今、そのプロジェクトを Java で使用したいと考えています。新しいプロジェクトに scala lib をインポートし、ビルド パスに scala プロジェクトを追加しました。エクリプスを使用しています。

ただし、これを実行しようとすると:

public class CoolClass extends B {  
    public CoolClass(){ }   
}

編集:

Javaでこれを使用する際にいくつか問題があり、疑問が生じました。それらを列挙しましょう:

  1. Scala のリストを使用したり、Java でエラーが発生したりすることはできますか?
  2. JavaでBを拡張するクラスでAの変数が認識されないのはなぜですか?
  3. の代わりにgetCsインターフェイスを提供するように宣言するにはどうすればよいですか?List<C>List<C<?>>
4

2 に答える 2

7

私は、あなたが定義したすべてのメソッドをclass BJava にも実装したと仮定していますclass CoolClass。ここで欠けているのはB、エラー メッセージにあるように、 のコンストラクターへの呼び出しです。

class CoolClass extends B {
  public CoolClass() {
    super("");
  }
  // methods implementations
}

にはデフォルトのコンストラクターが定義されていないclass Bため、定義されているコンストラクターを明示的に呼び出す必要がありB(n: String)ます。

編集:

1: 両面に好きなものを使用できます。ただし、メソッド名は、scala に特殊文字を含むものなど、いくつかの特殊なケースでは異なる場合があります。

2: それらはフィールドではなく、Java コード内のメソッドですが、認識されます。this.inputs()とでアクセスできます。this.outputs()

3: やってみるdef getCs[C]: List[C]

于 2012-04-05T22:47:30.730 に答える
1

あなたのBクラスは基本的にあなたが説明する通りです:

public abstract class B extends A {  
  public B(String n) {
    super(n);
  }

  public abstract void act()
  public abstract boolean isValid();
  public abstract List<C<?>> getCs();
}

CoolClassには、コンストラクターに明示的なスーパー呼び出しがありません。

public CoolClass extends B {
  public CoolClass() { // override ctor with no string parameter
    super("defaultStringValue");
  }

  public CoolClass(String n) { // override ctor with no string parameter
    super(n);
  }
  …

ご覧のとおり、Scalaを使用すると、コンストラクターを宣言して呼び出すのは非常に簡単です。Javaで追加されるボイラープレートの量を忘れてしまいます。

于 2012-04-06T02:52:30.270 に答える