1

Classインスタンスは、少なくともgetAnnotationメソッドに関しては、Classオブジェクトとオブジェクトを比較して異なるシグネチャを持っていることがわかり<some-object>.getClass()ます。

次のコードは、ケースの例を示しています。

@Bar("hello")
public class Foo {

    public static void main(String[] args) {

        Foo foo=new Foo();
        Bar bar1,bar2,bar3;

        Class clazz=foo.getClass();

        //This compiles and work (as expected)
        bar1=foo.getClass().getAnnotation(Bar.class);

        //This does not compile!
        bar2=clazz.getAnnotation(Bar.class);

        //This one copiles and work!
        bar3=(Bar) clazz.getAnnotation(Bar.class);

    }
}

@Retention(RetentionPolicy.RUNTIME)
@interface Bar {
    String value();
}

注:この例全体は、エディターからのコピー&ペーストです。

--------より良いシナリオを表示するための変更

外部ライブラリのように、「コード」がFooの存在を認識していないことを例で示すのを忘れました。

class SomeExternalLibrary{
    public static void someMethod(Class clazz){        
        Bar bar2,bar3;        

        bar2=clazz.getAnnotation(Bar.class);        

        //This one copiles and work!
        bar3=(Bar) clazz.getAnnotation(Bar.class);
    }
}

この外部ライブラリを使用するコードは次のようになります。

SomeExternalLibrary.someMethod(Foo.class);

私のシナリオの現実にあまり気づいていないことをお詫びします:-)

4

4 に答える 4

3

ジェネリックについての質問です。

コンパイル エラーの理由は、clazz変数にクラス情報が含まれていないことです。

コードを次のように変更すると、問題が解決します。

Class<Foo> clazz = foo.getClass();
于 2012-12-05T20:36:27.647 に答える
1

もう1つの答えは、ジェネリックスに関係しているという点で正しいですが、コードの変更は次のようになります。

Class<? extends Foo> clazz = foo.getClass();

2番目のシナリオでも、同じことが起こっています。ジェネリックスを使用していないので、は。getAnnotation(Bar.class)を返しますAnnotation。以下のようなジェネリックを使用する場合、それは機能します:

public static <T> void someMethod(Class<T> clazz) { ... }
于 2012-12-05T20:39:43.510 に答える
1

getAnnotation は、ジェネリックを使用して次のように定義されます。

<T> T getAnnotation(Class<T> clazz)

これは、コンパイル時にジェネリックを解決できる場合、注釈に型キャストが必要ないことを意味します。2 番目の例では、Class clazz変数は生の型として格納されています。Class<? extends Foo> clazz2番目の例としてそれを修飾する場合は機能します。

于 2012-12-05T20:43:35.990 に答える
0

理由はわかりませんが、次を使用すると機能します。

Class<?> clazz

それ以外の

Class clazz
于 2016-10-20T12:54:31.197 に答える