求教-泛化Class对象在容器中的存贮问题

yangkaixin1226 2009-11-30 09:08:04

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对象为何不可,为何仍要转型?
...全文
91 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
zfangla 2009-12-01
  • 打赏
  • 举报
回复
对的,
types.add(Class.forName("com.kevin.test2.C"));
其实等同于:
types.add( new Object() );

如果这样就可以:
types.add( new C() );
ouyangyh 2009-11-30
  • 打赏
  • 举报
回复
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);//不可以添加
lbl20020123 2009-11-30
  • 打赏
  • 举报
回复
因为编译阶段上不知道B和C的类型。

Class.forName("com.kevin.test2.C")

上述括号里的内容是动态的,编译阶段是没有Load,不知道类型的。
所以要加一个强制转换,才能保证编译通过。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧