オーバーライド等価性 + 総称化による共変引数
class A<T> { void f(T arg) {} }
class B extends A<String> { @Override void f(String arg) {} }
後者Bはコンパイル後に型の消去を受けて下記のようになるはず。
class B extends A { bridge void f(Object arg) { f((String) arg); } void f(String arg) { } }
m1とm2の「メソッド名」および「引数リストの各イレイジャ」が同一である場合に、m1, m2はオーバーライド等価性を持つということになっているが、
- A::f(|T|) = A::f(Object)
- B::f(|String|) = B::f(String)
であるから、B::f(String)はA::f(T)に対する@Overrideの指定があるのに、オーバーライド等価性がない。
暗黙のうちにブリッジメソッドを導入すればいいのかね?