可能有人会说这样解决
map.put("xxx", (Class<? extends Action>) c);但问题是“(Class<? extends Action>) c”,强制转换,这不是又回到了非泛型的路了?

解决方案 »

  1.   

    <? extends Abc>> 表示一个泛型,这个泛型为Abc的子类或者为其本身(Abc)类型。
      

  2.   

    public class TestG<T extends Abc> {    Map<String,T> map = new HashMap<String,T>();这样不就可以了
      

  3.   


    package test;import java.util.HashMap;
    import java.util.Map;public class Test { public static void main(String[] args) throws ClassNotFoundException { Map<String, Class<Test>> mapping = new HashMap<String, Class<Test>>(); String className = "xxx.xxx.xxx"; // 这里具体是什么并不重要 Class<?> c = Class.forName(className); mapping.put("a", c);
    }
    }最后mapping.put有编译错误的,怎么样调整好,不要用强制转换
      

  4.   

    由于泛型的编译期检查,如果不进行强制转换用平常的这样的写法是无法通过编译的。我们可以利用java泛型的只在编译期做检查的特点只要我们让编译器无法检查就行了,这种时候不用强转使用反射来调用put是最好的。package test;import java.lang.reflect.Method;
    import java.util.HashMap;
    import java.util.Map;public class Test { public static void main(String[] args) throws ClassNotFoundException { Map<String, Class<Test>> mapping = new HashMap<String, Class<Test>>(); String className = "xxx.xxx.xxx"; // 这里具体是什么并不重要 Class<?> c = Class.forName(className); Method method=Map.class.getMethod("put",Object.class,Object.class);
                    method.invoke(mapping,"a",c);
                    System.out.println(mapping);
    }
    }
      

  5.   

    这里必须做一次显示转换
    if (c instance of Class<Abc>) {
      Class<? extends Abc> abcC = (Class<? extends Abc>) c;
      mapping.put("xxx", abcC);
    }