Created
May 18, 2012 10:13
-
-
Save yamashiro/2724450 to your computer and use it in GitHub Desktop.
これなんでコンパイルエラーになるの?
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Hoge() {}; var hoge = List(new Hoge()); hoge foldLeft(Map[String, Hoge]()) ( (map:Map[String,Hoge], hoge:Hoge) => map + ("hoge" -> hoge) ); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
これは、Scalaのメソッド呼び出しの構文によるものです。
hoge foldLeft(MapString, Hoge) ( (map:Map[String,Hoge], hoge:Hoge) => map + ("hoge" -> hoge) )
は、 レシーバhogeの後に.が続いていないので、「2項演算子形式」のメソッド呼び出しとみなされます。つまり、
==> hoge.foldLeft( (MapString, Hoge) ( (map:Map[String,Hoge], hoge:Hoge) => map + ("hoge" -> hoge) ) )
という風に解釈されます。ここで、この解釈ですと、
Map[String, Hoge]に対してapplyメソッドを呼び出すことになります。このとき、引数の型はStringである事が期待されるのに、
(map:Map[String,Hoge], hoge:Hoge) => map + ("hoge" -> hoge)) という式によって (Map[String, Hoge], Hoge) => Map[String, Hoge]
という型になってしまうため、
found : (Map[String,this.Hoge], this.Hoge) => Map[String,this.Hoge]
required: java.lang.String
というエラーになるのです。個人的なアドバイスとしては、foldLeft, mapなどのいわゆる高階関数は、レシーバには.を付ける事をお勧めします。