2011-09-22 8 views
9

私はJava Class [_](ScalaのJavaリフレクションのコンテキストで)でScalaパターンマッチングを使用しようとしていますが、予期しないエラーが発生しています。なぜこれが起こっている以下は、場合jLongクラス[_]タイプのパターンマッチング?

def foo[T](paramType: Class[_]): Unit = { 
    val jInteger = classOf[java.lang.Integer] 
    val jLong = classOf[java.lang.Long] 
    paramType match { 
    case jInteger => println("int") 
    case jLong => println("long") 
    } 
} 

任意のアイデアを持つ行の「到達不能コード」を与えますか?あなたのコードで

scala> def foo[T](paramType: Class[_]): Unit = { 
    | val jInteger = classOf[java.lang.Integer] 
    | val jLong = classOf[java.lang.Long] 
    | paramType match { 
    |  case `jInteger` => println("int") 
    |  case `jLong` => println("long") 
    | } 
    | } 
foo: [T](paramType: Class[_])Unit 

scala> foo(classOf[java.lang.Integer]) 
int 

第一のパターンでjIntegerが新しいvariable-です:

答えて

15

コードを使用すると、大文字に変数名を変更する(またはパターンでバッククォートでそれらを囲む)場合期待どおりに動作します周囲の範囲からはjIntegerではありません。 specificationから:

8.1.1可変パターン

...可変パターンxは小文字で始まる単純な識別子です。 は任意の値と一致し、変数名をその値にバインドします。

...

8.1.5安定識別子パターン

...可変パターン構文重なりを解決するために、安定した 識別子パターンが始まる単純な名前ではないかもしれません小文字の 文字。しかし、そのような変数名を 逆引用符で囲むことは可能です。安定した識別子パターンとして扱われます。

詳細については、this questionを参照してください。

+1

バッククォート大丈夫ですが私より優れたソリューションです:) – JaimeJorge

+0

すごいです!多くのありがとう、トラビス。 – alphageek

7

パターンマッチングでは、これらの2つのケースのそれぞれが、クラスタイプを予想どおりにマッチングする代わりにプレースホルダ名を作成しようとします。

あなたが開始文字に大文字を使用する場合は、あなたが

def foo[T](paramType: Class[_]): Unit = { 
    val JInteger = classOf[Int] 
    val JLong = classOf[Long] 
    paramType match { 
    case JInteger => println("int") 
    case JLong => println("long") 
    } 
} 

scala> foo(1.getClass) 
int 
関連する問題