0

最近、インターネットで情報が見つからないため、Scalaから多くの問題が発生しています。Scalaは(私はまだ知らない)彼自身の言語を一連の無限の用語で定義しているので、情報を得るのは難しいです。

私はScalaとJavaの間のこの変換に関してStackOverflowについていくつか質問をしました。最後の質問で、私はこのアプローチをあきらめるつもりだと言いました。しかし、私は何が起こっているのかを理解したいと思います。

Scalaクラスを想像してみてください。

abstract class Block(n: String) {

    require(n != null)
    val name = n

    var log: ArrayList[String]
    var inputs: ArrayList[Input[_]]
    var outputs: ArrayList[Output[_]]

    def newValue
}

ここまでは順調ですね。問題は:

クラスフィールドにアクセスできません(はい、試しthis.inputs()ました)。そしておそらくそれはこれに翻訳されているためです:

public abstract class pt.thesis.tiago.Block 
    extends java.lang.Object implements  scala.ScalaObject{

    public java.lang.String name();
    public abstract java.util.ArrayList log();
    public abstract void log_$eq(java.util.ArrayList);
    public abstract java.util.ArrayList inputs();
    public abstract void inputs_$eq(java.util.ArrayList);
    public abstract java.util.ArrayList outputs();
    public abstract void outputs_$eq(java.util.ArrayList);
    public abstract void newValue();
    public pt.thesis.tiago.Block(java.lang.String);
}

なぜすべてのものが抽象的なのですか?私はJavaが好きではなく、欲しいものだけが抽象的です。

4

2 に答える 2

3

すべてが抽象的ではありません。名前は抽象的ではありません。

実際、これは抽象クラスであるため、宣言されているが未定義の値をいくつか持つことができ、それ自体が抽象としてタグ付けされます。したがって、「入力」を抽象化したくない場合は、次のように定義します。

var inputs = ArrayList[Input[_]]()

編集:コメントの追加の質問については、デフォルト値(nullになります)を引き続き使用できます:

abstract class Input[Type]{ 
  var value:Type = _; 
}

Scalaのフィールドに「_」を割り当てるとはどういう意味ですか?と詳細については優れた答え。

于 2012-04-06T13:45:21.590 に答える
3

Scalaを学ぶための資料に関しては、Martin Odersky(Scalaの作成者)、Lex Spoon、Bill Vennersによる、ProgramminginScalaを読んで多くのことを学びました。また、 docs.scala-lang.orgには、かなりまともなScalaツアーとともに、多くの優れた情報があります。

用語に関しては、Scalaがそれほど多くの用語を発明したとは思いません。これらの用語は、あなたがよく知らない言語(ErlangHaskellMLなど)または型理論のような他の言語ではあまり議論されない概念に由来する可能性があります。

ここでの一般的な原則は、Scalaは非常に正規言語であるということです。実際、Martinはそれをよりシンプルでより規則的なものにしたいと考えています。

Javaでは、メソッドのみが抽象化される場合があります。Scalaでは、基本的にクラスのメンバーは抽象的である可能性があります。Scalaでは、アイテムを抽象化するために、その定義を省略します。したがって、ステートメントは実際には、で初期化された具象棒ではなくvar log: ArrayList[String]、抽象変数を作成します。はい、これはJavaからの期待とは異なります。しかし、それは全体としてScalaをより正規言語にします。null

abstract class Foo {
  type SomeType               // abstract type

  val someVal: SomeType       // abstract val

  var someVar: SomeType       // abstract var

  def someMethod(v: SomeType) // abstract method
}

に初期化されたフィールドを実際に作成する場合は、を使用して初期null化し_ます。これにより、抽象的な変数ではなく具体的​​な変数が作成されます。

于 2012-04-06T14:27:43.750 に答える