scala> class Can[+A]{ | def openOr(default:A) :A = default | } といったふうに定義すると --------------- <console>:6: error: covariant type A occurs in contravariant position in type A of value default def openOr(default:A) :A = default ^ --------------- とエラーが出ます。これはどういうことなんでしょう? エラーが出る理由はこのありがた〜いページにあり納得しましたが・・・
scala> a.openOr[GoodPerson](new Person()); <console>:8: error: type mismatch; found : Person required: GoodPerson a.openOr[GoodPerson](new Person()); ^ scala> a.openOr[Person](new GoodPerson()); res34: Person = GoodPerson@14ddd67 scala> a.openOr[Person](new Person()); res35: Person = Person@14ce1fd scala> a.openOr[Person]("String"); <console>:7: error: type mismatch; found : java.lang.String("String") required: Person a.openOr[Person]("String");
メソッドのほうにも明示的にPersonとか入れると それっぽい動きに・・・
^ ためしに
scala> var b = new Can[String](); b: Can[String] = Can@1b56b0b
scala> b.openOr[Person](new Person()); <console>:7: error: type arguments [Person] do not conform to method openOr's ty pe parameter bounds [B >: String] b.openOr[Person](new Person()); ^ とやるとしっかりエラー。クラスの定義[+A]と関係なくもなさそう。。。