プログラミング言語 Scala 7冊目
■ このスレッドは過去ログ倉庫に格納されています
おーけーです。これから述べます。の前に
> あと、(2)と(3)はそれで正しい?
はい。それで正しいです(少なくともScalaにおいて) 。
さて、その理由が議論の本質、ということなので以下に理由を述べます。先ほどは、
> (3) def f3[T <: { def +[U >: T](other: U): U }](x: T, y: U) = x + y
に対して、f3(100, 200) のような式が型チェックを通らないということを書きました。
ここで、問題になるのは、Intの+のシグニチャが(オーバーロードバージョンを無視したとして)、
(Int)Int
であるのに対して、(3)で、structural typeによって要求されているシグニチャは
[U >: T](U)U
であることです(ちなみに、これはScalaにおける「メソッド型」の表記法です)。この二つの
メソッドシグニチャ(というより、非ジェネリックメソッドとジェネリックメソッド一般に)には
互換性が無いので、型チェックを通りません。一方、(2)の場合、structural typeによって要求されるシグニチャは
(T)T
になります。ポイントは、(2)の場合、「+そのもの」は多相メソッドではないので、T = Intとしてインスタンス化されている
場合、
(Int)Int
になり、(1)のケースを包含することです。長くなりましたが、一言で理由を述べるなら、「非多相メソッド」と「多相メソッド」の
シグニチャの間には互換性が成立しない、ということが根本的な問題です。
■ このスレッドは過去ログ倉庫に格納されています