繁体   English   中英

java泛型类强制转换

[英]java generic class cast

你好我有哈希映射值:

    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(“未选中”)很好......:/

我能不这样做吗? (Class<? extends AGenerator<?>>) NumericGenerator.class

使用Class<? extends AGenerator> Class<? extends AGenerator>

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

在Java中,类可以表示原始类型,但不能表示泛型类型。

List有一个类,但List<String>没有类。

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

但是Class<? extends List<?>> Class<? extends List<?>>没有多大意义,因为没有类是List<?>的子类型。

一切都要归功于擦除。

编译时间检查不允许你这样做,除非你当然把它转换。

有关泛型类型的信息在运行时丢失,而不是在编译时丢失。

在版本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);
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM