プログラミング言語 Scala 2冊目
■ このスレッドは過去ログ倉庫に格納されています
0020デフォルトの名無しさん
2009/07/04(土) 04:14:17implicit parameterに適合するobjectを見つけるために、implicit parameterに関連付けられた(associated)クラスの
companion objectを探索しに行くというルールがある。関連付けられたクラスというのは、詳細はScala言語仕様の
7.2 implicit parametersを参照して欲しいんだけど、たとえば、
implicit bf :BuilderFactory[(String, Int), That, Map](Thatは不明な型)
の場合(これは、(String, Int)を返す無名関数が渡された場合になる)、BuilderFactory、Tuple2、Map、それらのスーパークラス、が関連付けられた
クラスになる。で、Mapのcompanion objectを見てみると、
implicit def builderFactory[A, B] : BuilderFactory[(A, B), Map[A, B], Map]
となっており、A = String, B = Intとすると、bfに適合する型になるため、これが選択される。その結果、
That = Map[A, B] = Map[String, Int]となり、これが返り値の型になる。一方、
implicit bf :BuilderFactory[Int, That, Map](Thatは不明な型)
の場合(Intを返す無名関数の場合)、Mapのcompanion object内のimplicit defにはマッチせず、そのスーパークラスであるIterableの
companion object内のimplicit def
implicit def builderFactory [A] : BuilderFactory[A, Iterable[A], Iterable]
にマッチして(A = Int)、返り値の型That = Iterable[A] = Iterable[Int]になる。まあ、これでわかると思うけど、なかなかにややこしい。
APIドキュメントにThatがどういう風に選ばれるのかちゃんと書かれてないと、APIドキュメントだけから読み解くのは結構きついもの
があると思う。
■ このスレッドは過去ログ倉庫に格納されています