2012-09-17 50 views
3

你好我有哈希映射值:Java的泛型类投

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

而在日食我有错误的方法并不适用于ARG ument?

但:

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

和@SuppressWarnings( “未登记”)为好..:/

我能做到这一点没有铸造? (Class<? extends AGenerator<?>>) NumericGenerator.class

回答

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<?>的子类型。

而且都要归功于擦除。

1

编译时检查不会允许你这样做,除非你投它当然。

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

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

} 
+0

是,'X'是AGenerator ''的一个亚型。但“X”不是通用的,与OP的例子不同。 – irreputable

+0

@Misrable Variable,但考虑类似您的X类用户泛型的情况:class X implements AGenerator 这是不允许的:/ –

+0

@irreputable,Lukasz谢谢。了解。 –