package com.kevin.test2;import java.util.ArrayList;
import java.util.List; class A {}
 class B extends A{
 
 }
 class C extends A{
 
 }
 public class Test{
 private static List<Class<? extends A>> types =
 new ArrayList<Class<? extends A>>();  public static void main(String [] args) throws ClassNotFoundException{
 types.add((Class<? extends A>)Class.forName("com.kevin.test2.C")); 
 types.add((Class<? extends A>)Class.forName("com.kevin.test2.B"));
 //types.add(Class.forName("com.kevin.test2.C")); 
 //types.add(Class.forName("com.kevin.test2.B"));
 
 }
 }
请问ArrayList中既然装的是A或是A的子类的Class对象,那么像注释的那样传递B和C的Class对象为何不可,为何仍要转型?

解决方案 »

  1.   

    因为编译阶段上不知道B和C的类型。Class.forName("com.kevin.test2.C")上述括号里的内容是动态的,编译阶段是没有Load,不知道类型的。
    所以要加一个强制转换,才能保证编译通过。
      

  2.   

    Class.forName("com.kevin.test2.C")它返回的是一个Class对象,它并不是泛型的
    就像
    List<String> list=new ArrayList<String>();
    Sting str="Ok";
    list.add(str);//可以添加
    Object obj=str;
    list.add(obj);//不可以添加
      

  3.   

    对的, 
    types.add(Class.forName("com.kevin.test2.C")); 
    其实等同于:
    types.add( new Object() ); 如果这样就可以:
    types.add( new C() );