オーバーライド等価性 + 総称化による共変引数

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の指定があるのに、オーバーライド等価性がない。


暗黙のうちにブリッジメソッドを導入すればいいのかね?