3

こんにちは、値を持つハッシュマップを取得しました:

    private static final LinkedHashMap<Class<? extends Annotation> , Class<? extends AGenerator<?>>> annotationGeneratorMap = new LinkedHashMap<Class<? extends Annotation>, Class<? extends AGenerator<?>>>();

私の数値ジェネレーターは次のようになります:

public abstract class NumericGenerator<T extends Number> extends AGenerator<T>{


public NumericGenerator(Field field) {
    super(field);
    // TODO Auto-generated constructor stub
}

public T random() {
    // TODO Auto-generated method stub
    return null;
}

  }

そして、このクラスをハッシュマップに入れる必要があるときに問題が発生しました:

annotationGeneratorMap.put(GenerateNumeric.class, NumericGenerator.class);

そして、Eclipseでは、メソッドが引数に適用できないというエラーが発生しました???

しかし :

        annotationGeneratorMap.put(GenerateNumeric.class, (Class<? extends AGenerator<?>>) NumericGenerator.class);

そして @SuppressWarnings("unchecked") は良い..:/

キャストせずにこれを行うことはできますか??(Class<? extends AGenerator<?>>) NumericGenerator.class

4

3 に答える 3

2

Class<? extends AGenerator>代わりに使用

LinkedHashMap<
    Class<? extends Annotation>, 
    Class<? extends AGenerator> > annotationGeneratorMap = new LinkedHashMap<>()

Java では、クラスは生の型を表すことができますが、ジェネリック型を表すことはできません。

のクラスはありますが、のクラスListはありませんList<String>

生の型は のサブタイプであるため、 etcClass<? extends List>と互換性がある を宣言できます。ArrayList.classArrayListList

しかしClass<? extends List<?>>、 のサブタイプであるクラスがないため、あまり意味がありませんList<?>

そして、すべて消去のおかげです。

于 2012-09-17T21:40:05.457 に答える
1

以下はバージョンでエラーなしでコンパイルします1.7.0_02

import java.util.*;
import java.lang.annotation.*;

interface AGenerator<T> {}

interface A extends Annotation {}
class X implements AGenerator<X> {}

class E7 {
    private static final LinkedHashMap<Class<? extends Annotation>, 
        Class<? extends AGenerator<?>>> annotationGeneratorMap 
        = new LinkedHashMap<Class<? extends Annotation>, 
                            Class<? extends AGenerator<?>>>();


    void foo() {
        annotationGeneratorMap.put(A.class, X.class);
    }

}
于 2012-09-17T22:11:21.807 に答える
1

コンパイル時のチェックでは、もちろんキャストしない限り、それを行うことはできません。

ジェネリック型に関する情報は、コンパイル時ではなく実行時に失われます。

于 2012-09-17T21:57:22.923 に答える