2017-07-04 4 views
1


私はスカラを初めて利用しており、マップで作業していました。私はマップを取得しますが、戻り値の型をチェックして使用する方法がわかりません。
私はコンパイルエラー「パターン・タイプが期待されるタイプと互換性がありません、以下与え次のコードています。TestClass.type必要なオプション[TestClassを]を
スカラからの値の照合方法

object MapOptionUsage extends App { 
val map : Map[Int, TestClass] = Map[Int, TestClass]() 
var i = 0 
for(i <- 0 to 5){ 
    map.put(i, createObj(i)) 
} 
var a = map.get(5) 

a match { 
    case TestClass => {//dosomething 
    } 
    case None => {//dosomething 
    } 
    } 
    def createObj(i: Int): TestClass = { 
    return new TestClass(i) 
    } 
} 
case class TestClass(val id: Int) 

答えて

2

get()戻りOption[]、およびTestClassは、コンストラクタのパラメータを取り、あなたので、それらのものの両方に一致する必要があります。

case Some(TestClass(x)) => {//dosomething 

ところで、良いScalaのコードがvarまたはreturnを使用していません。

+0

それは働いた。しかしもう一つの質問。どのようにして変数Some(TestClass(x))でこれを得ることができるので、そのケースブロックの中で使うことができますか? – Sandeep

+0

'case Some(TestClass(x))'は 'Option [TestClass]'と一致し、 'x'は' id'値を含む変数です。 'case Some(x)'は 'Option []'にマッチし、 'x'は' TestClass'(この場合)を保持する変数です。 'case x'は任意の値と一致し、' x'はその値を含むvarableです。 – jwvh

1

いくつかの問題があります。

  1. あなたのマップは不変です。不変のマップの中に物を置くことはできません。 val map : mutable.Map[Int, TestClass] = mutable.Map[Int, TestClass]()

  2. case Some(x)=> {//dosomething戻り値はOptionであるため、一致するSome型が必要です。

  3. def createObj(i: Int): TestClass = {である必要があります。オブジェクトに定義する必要があります。マッチステートメント内には定義しないでください。

編集:コメントに対処する。

case Some(x)=> {//dosomething 
    System.out.println(x.id) 
} 

xがSomeの内容、つまり、マップ内に含まれるTestClassと等しい新しい値を作成して作成します。

+0

申し訳ありませんがインポートが忘れましたが、私は変更可能なマップを使用しています、そして、createObjはマッチ内で定義されていません。 – Sandeep

+0

2.まだ有効です。 1と3はあなたの質問の中で間違っていました。 TestClass Some(TestClass(x))がxとintを照合する部分がxと一致します。 –

+0

mutable.mapをインポートしないと、コードを読み取った読者が混乱します。 –

関連する問題