ジェネリックが含まれていない場合にメソッドがオーバーライドされるかどうかを判断するための既存の回答があります。
Java は、型消去のためにジェネリック型を完全に削除します。したがって、バイトコードは次のようになります。
class FooImpl implements Foo<java.lang.String> {
FooImpl();
Code:
0: aload_0
1: invokespecial #10 // Method java/lang/Object."<init>":()V
4: return
public void doStuff(java.lang.String);
Code:
0: return
public void doStuff(java.lang.Object);
Code:
0: aload_0
1: aload_1
2: checkcast #21 // class java/lang/String
5: invokevirtual #23 // Method doStuff:(Ljava/lang/String;)V
8: return
}
doStuff メソッドは 2 つあります。ブリッジ方式です。単純に型キャストを行い、void doStuff(java.lang.String) を呼び出すため、実際にはvoid doStuff(java.lang.String) は overridenではありませんが、 void doStuff(java.lang.Object) はです。次のようなポリモーフィズムを使用する場合:
Foo foo = new FooImpl();
foo.doStuff("ABC")
実際には void doStuff(java.lang.Object) を呼び出します。したがって、上記のリンクを使用して void doStuff(java.lang.Object) がオーバーライドされているかどうかを検出すると、yes と報告されます。
public static void main(java.lang.String[]);
Code:
0: new #1 // class FooImpl
3: dup
4: invokespecial #22 // Method "<init>":()V
7: astore_1
8: aload_1
9: ldc #23 // String ABC
11: invokeinterface #25, 2 // InterfaceMethod Foo.doStuff:(Ljava/lang/Object;)V
16: return