10

これは可能ですか?

Class B私が見つけた唯一の解決策は、通常、から割り当て可能で、と同じ署名があるClass A場合、メソッドをオーバーライドされたと見なします。しかし、すべてのケースを網羅しているわけではありません!Method AMethod B

たとえば、このケースを処理したい:

interface Foo<T> {
    void doStuff(T arg);    
}

class FooImpl implements Foo<String> {
    public void doStuff(String args) {
        //Is overriden!  
    }
}

Method Bまた、実際にMethod A(パッケージスコープなど)に表示されていることも確認したいと思います。

メソッドがオーバーライドされているかどうかを判断するための信頼できる方法を経験したことがありますか?

ありがとうございました

4

1 に答える 1

5

ジェネリックが含まれていない場合にメソッドがオーバーライドされるかどうかを判断するための既存の回答があります。

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
于 2013-03-07T09:33:22.263 に答える