A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© gzbbxu 中级黑马   /  2013-6-27 12:48  /  2240 人查看  /  15 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 巩建 于 2013-6-29 12:32 编辑

为什么呢?、

15 个回复

倒序浏览
添加了泛型,就不能添加其他类型的对象了。
回复 使用道具 举报
泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 Java语言引入泛型的好处是安全简单。
回复 使用道具 举报
王靖远 发表于 2013-6-27 12:53
添加了泛型,就不能添加其他类型的对象了。

通过反射算不算呢?
回复 使用道具 举报
gzbbxu 发表于 2013-6-27 13:14
通过反射算不算呢?

反射后应该就没泛型了吧?反射获得的是类。
回复 使用道具 举报
你这个问题很笼统,泛型可以定义上下限
总之,在一个类的泛型中,只能添加你限定的泛型类型
回复 使用道具 举报
gzbbxu 中级黑马 2013-6-27 13:36:22
7#
王靖远 发表于 2013-6-27 13:21
反射后应该就没泛型了吧?反射获得的是类。
  1. import java.lang.reflect.InvocationTargetException;
  2. 2 import java.util.ArrayList;
  3. 3
  4. 4
  5. 5 public class Test2 {
  6. 6    public static void main(String[] args) throws IllegalArgumentException, SecurityException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
  7. 7        //已经参数化的类型。
  8. 8      ArrayList<String> collection1=new ArrayList<String>();
  9. 9      ArrayList<Integer> collection2=new ArrayList<Integer>();
  10. 10      System.out.println(collection1.getClass()==collection2.getClass());
  11. 11     // 编译错误 collection2.add("abc");
  12. 12      collection2.getClass().getMethod("add",Object.class).invoke(collection2, "abc");
  13. 13      System.out.println(collection2.get(0));
  14. 14    }
  15. 15 }
复制代码
我想知道,这个算不算呢?
回复 使用道具 举报
gzbbxu 中级黑马 2013-6-27 13:37:07
8#
  1. import java.lang.reflect.InvocationTargetException;
  2. 2 import java.util.ArrayList;
  3. 3
  4. 4
  5. 5 public class Test2 {
  6. 6    public static void main(String[] args) throws IllegalArgumentException, SecurityException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
  7. 7        //已经参数化的类型。
  8. 8      ArrayList<String> collection1=new ArrayList<String>();
  9. 9      ArrayList<Integer> collection2=new ArrayList<Integer>();
  10. 10      System.out.println(collection1.getClass()==collection2.getClass());
  11. 11     // 编译错误 collection2.add("abc");
  12. 12      collection2.getClass().getMethod("add",Object.class).invoke(collection2, "abc");
  13. 13      System.out.println(collection2.get(0));
  14. 14    }
  15. 15 }
复制代码
这个算不算是可以添加其他类型的一个案例呢?
回复 使用道具 举报
gzbbxu 发表于 2013-6-27 13:37
这个算不算是可以添加其他类型的一个案例呢?

这个反射得到的应该是没有泛型的吧。所以才能添加其他类型
回复 使用道具 举报
王靖远 发表于 2013-6-27 13:52
这个反射得到的应该是没有泛型的吧。所以才能添加其他类型

你的意思我不太明白。我还是坚持我的。
回复 使用道具 举报
张承富 发表于 2013-6-27 13:36
你这个问题很笼统,泛型可以定义上下限
总之,在一个类的泛型中,只能添加你限定的泛型类型 ...

我想问的是,通过反射,泛型跳过编译阶段,算是可以添加其他类型的对象吗?
回复 使用道具 举报
怎么这个问题都没有好的答案呢?
回复 使用道具 举报
不可以    添加的话  编译时会报告错误     
回复 使用道具 举报
gzbbxu 发表于 2013-6-27 16:50
怎么这个问题都没有好的答案呢?

Java的泛型机制是只存在与编译阶段之前的,在编译器编译之后就会去掉泛型信息。所以,可以通过反射在运行时添加其他类型信息。不过,使用泛型就是为了更好的安全性,这么做就违背了它存在的意义了。
回复 使用道具 举报
可以,泛型管的是编译时期,绕过编译时期就能添加,用反射获取method对象的add方法就能添加。
回复 使用道具 举报
。。呵呵。。泛型和反射是一对冤家啊,,

泛型不参加运行,,,只参加编译,,

而反射,,真好可以越过泛型的检查,,,因为他是在运行时调用的,,
编译期泛型管不到他,,,,

哈哈哈
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马