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;
}

  }

当我需要将此类放入 hashmap 时,我遇到了问题:

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>

所以你可以声明Class<? extends List>,它与ArrayList.class等兼容,因为原始类型ArrayListList.

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 回答