15

次のコードがあるとします。

public interface Address {
    public int getNo();
}

public interface User<T extends Address> {
    public String getUsername();
    public T getAddress();    
}

public class AddressImpl implements Address {
    private int no;
    public int getNo() {
        return no;
    }
    public void setNo(int no) {
        this.no = no;
    }
}

public class UserImpl implements User<AddressImpl> {
    private String username;
    private AddressImpl addressImpl;

    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }

    public AddressImpl getAddress() {
        return addressImpl;
    }

    public void setAddress(AddressImpl addressImpl) {
        this.addressImpl = addressImpl;
    }
}

コードの実行:

int getAddressMethodCount = 0;
for (Method method : UserImpl.class.getMethods()) {
    if (method.getName().startsWith("getAddress")) {
        getAddressMethodCount++;
    }
}

getAddressMethodCountvariableの場合は 2 になります。これはなぜですか?

4

1 に答える 1

8

これは、共変の戻り値の型を実装する方法です。javap -private反射より便利に表示します。

サブクラスには、より具体的なメソッドへの転送を処理する合成ブリッジ メソッドがあります。JVMに関する限り、メソッドには名前、生の型付きパラメーターのシーケンス、および生の型の戻り値があります。バイトコードで戻り値の型をオーバーロードできます。

ではSystem.err.println(mehtod.getReturnType());、2 つの方法で異なる結果が得られるはずです。

于 2013-05-03T14:10:40.737 に答える