[英]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
等兼容,因为原始类型ArrayList
是List
的子类型。
但是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.