10

こんにちは仲間の Scala プログラマー

Scala を使って数か月が経ちましたが、適切に基本的な部分に問題があります。助けてくれることを願っています。

case class PersonClass(name: String, age: Int)

object CaseTester {
def main(args:Array[String])
 {
  val string = "hej"
  string match {
    case e:String => println(string)
    case PersonClass => println(string)
  }
 }
}

私がこのようにやっていると、エラーが発生します:

pattern type is incompatible with expected type;
found   : object PersonClass
required: java.lang.String
case PersonClass => println(string)

次に、パターン マッチングの 2 行目を次のように変更するとします。

case e:PersonClass => println(string)

次に、エラーが発生します。

error: scrutinee is incompatible with pattern type;
found   : PersonClass
required: java.lang.String
case e:PersonClass => println(string)

ただし、文字列定義を次のように変更すると、どちらの場合でも正常にコンパイルされます。

val string:AnyRef = "hej"
4

4 に答える 4

22

文字列の推定型は String です。これは、val の宣言後にわかります。

パターン マッチング中に既にわかっているように、文字列ではないパターン (PersonClass など) を一致させることは意味がありません。それが、「パターン型が予期された型と互換性がありません; 見つかった: オブジェクト PersonClass が必要です: java.lang.String ケース PersonClass => println(string)」 エラーが意味するものです: String のサブクラスであるパターンを期待していますが、何かが見つかりました ( PersonClass) ではありません。

タイプ AnyRef を強制すると、状況が変わります。コンパイラは文字列を Anyref として扱うため、AnyRef を拡張するパターンが一致する可能性があります。PersonClass は AnyRef であるため、エラーは発生しません。

于 2010-04-16T10:43:39.330 に答える
9

タイプ String のオブジェクトがすでにある場合、タイプ PersonClass と一致することはありません。実際には、コンパイラーがこれらの一致を許可しない機能であり、決して成功することはありません。

Any タイプでは、タイプ チェックをオフにするだけです。この定義とは一致しませんが、コンパイラはこの問題をキャッチできません。

于 2010-04-16T10:41:08.933 に答える
5

何か他のものをテストしようとしていると思いますが、コンパイラはあまりにも賢く、それを許すことはできません。

多分あなたはこのようなものが欲しい:

object Test {
  case class Person(name: String, age: Int) { }
  def myPrint(ar: AnyRef) {
    ar match {
      case s: String => println(s)
      case Person(name, age) => println("My name is "+name)
      case _ => println("I am a mystery!")
    }
  }
  def test = {
    myPrint("Hello, World")
    myPrint(Person("John Doe",40))
    myPrint(5)
  }
}

しかし、他の人が指摘しているように、実際に他の型をチェックする必要がない場合、コンパイラはあなたがしていることは無意味であると不平を言うでしょう。良いこともあります。テストを書いていなければ、デバッグが困難な実行時エラーが発生する可能性があります。

于 2010-04-16T14:21:17.783 に答える
0
object ws {

case class PersonClass(name:String,age: Int)
val p=new PersonClass("ach",25)                    

  def string(x: Any) = x match {
    case x:String => println(x)
    case x:PersonClass => println(p.name +" "+p.age)
   }                                              

     string("aa")                                 //> aa
     string(p)                                    //> ach 25

}
于 2013-12-27T17:10:28.477 に答える