2012-04-06 26 views
0

私はインターネット上の情報を見つけることができないので、スカラは最近私に多くの見出しを与えています。 Scalaは彼自身の言語を定義しています(私はまだ分かりません)無限という用語を使って情報に到達するのは難しいです。スカラ抽象クラスからJavaへ

私はScalaとJavaの間のこの翻訳に関してStackOverflowに関するいくつかの質問をしました。last question私はこのアプローチをあきらめようとしていました。しかし、私は何が起こっているのか理解したいと思います。

は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のようにすることはできませんし、私が欲しいのは抽象だけです。

+2

苦情から始まり、脅威のようなもので終わることは、ここで質問を構成するための建設的な方法ではありません。 –

+0

私は誤解されたと信じています。まず第一に、不平はなかった。なぜ私はそんなに繁栄しているのかに関する情報を提供しました。おそらく、誰かが "スカラーのための良い初期情報がたくさんあるこのウェブサイトをチェックしてください"と言ってそれを解決するかもしれません。申し訳ありませんが、それは不平のように見えます。 2番目私はstackoverflowから誰も脅かさなかった。実際、私はStackOverflowユーザーにはもうこのテーマに関する質問がありません。 「申し訳ありませんが、この件について私が最後に尋ねるのはこれだけです。 Probly私は調子を洗練し、それのいくつかの欲求不満を離すことができます:) –

答えて

3

Scalaを学ぶための資料に関しては、私はMartin Odersky(Scalaの創作者)、Lex Spoon、Bill Vennersによると、ちょうどProgramming in Scalaと読むことをたくさん学びました。また、docs.scala-lang.orgには多くの良い情報があり、かなりまともなものはTour of Scalaです。

用語に関して、私はScalaが多くの用語を発明したとは思わない。これらの用語は、あなたが慣れていない言語(ErlangHaskellMLなど)や、他の言語で議論されたくない概念(type theoryなど)に由来する可能性があります。

ここでの一般的な原則は、Scalaが非常に規則的な言語であることです。実際には、マーティンはmake it simpler and more regularを望んでいます。

Javaでは、メソッドだけが抽象メソッドである可能性があります。 Scalaでは、基本的にクラスの任意のメンバーは抽象クラスである可能性があります。 Scalaでは、アイテムを抽象的にするために、定義を省略します。したがって、文var log: ArrayList[String]は実際にはnullで初期化されたではないではなく、抽象的なvarを作成します。はい、これはJavaの期待とは異なります。しかし、Scalaはより一般的な言語になります。

abstract class Foo { 
    type SomeType    // abstract type 

    val someVal: SomeType  // abstract val 

    var someVar: SomeType  // abstract var 

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

あなたが実際に_でそれを初期化し、その後、nullに初期化フィールドを作成したい場合。それは抽象的なものではなく、具体的な仮想を作成します。

+0

私は他の答えを受け入れた後、多くの情報が付属しています。どちらも良い答えですが、私は最初の問題をカバーしました:情報を探しています。実際には、私は本を買って、すでに160〜のページかそれまで読む。私は本が大好きです。しかし、高密度です。私にとって、それは決して機能的な言語/用語との接触がなかったので、すべての概念を吸収するにはある程度の時間が必要です。あなたが提供した追加情報をありがとう。 –

3

すべてのものは抽象ではありません。名前は抽象ではありません。

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

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

編集:コメント欄にaditional質問について、あなたはまだ(nullになります)、デフォルト値を使用することができます。

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

what does it mean assign "_" to a field in scala?を参照してください。

+0

1モードで2つの質問に申し訳ありませんが、私は私がStackOverflowをスパムしていたと感じていた。あなたは1つしか答えなかったので、おそらく誰かがそれに答える前にこの質問を分けるでしょう:)。 –

+0

あなたのソリューションについて。それはほとんどの事のために働いた。しかし、まだ1つ残っています: 私は: '抽象クラス入力[型] {var値:型;} 'それは' Type() 'または' null'で開始することはできません –

+0

あなたの値を 'Type'に依存させたい場合、この抽象クラスを拡張するクラスごとにこの値が異なるので、抽象クラスisn 'を使用する理由の一種です。それ? –

関連する問題