黑马程序员技术交流社区

标题: 泛型中,可以添加其他类型的对象吗?? [打印本页]

作者: gzbbxu    时间: 2013-6-27 12:48
标题: 泛型中,可以添加其他类型的对象吗??
本帖最后由 巩建 于 2013-6-29 12:32 编辑

为什么呢?、
作者: 王靖远    时间: 2013-6-27 12:53
添加了泛型,就不能添加其他类型的对象了。
作者: 280270738    时间: 2013-6-27 13:07
泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 Java语言引入泛型的好处是安全简单。

作者: gzbbxu    时间: 2013-6-27 13:14
王靖远 发表于 2013-6-27 12:53
添加了泛型,就不能添加其他类型的对象了。

通过反射算不算呢?

作者: 王靖远    时间: 2013-6-27 13:21
gzbbxu 发表于 2013-6-27 13:14
通过反射算不算呢?

反射后应该就没泛型了吧?反射获得的是类。
作者: 张承富    时间: 2013-6-27 13:36
你这个问题很笼统,泛型可以定义上下限
总之,在一个类的泛型中,只能添加你限定的泛型类型
作者: gzbbxu    时间: 2013-6-27 13:36
王靖远 发表于 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
  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 }
复制代码
这个算不算是可以添加其他类型的一个案例呢?
作者: 王靖远    时间: 2013-6-27 13:52
gzbbxu 发表于 2013-6-27 13:37
这个算不算是可以添加其他类型的一个案例呢?

这个反射得到的应该是没有泛型的吧。所以才能添加其他类型
作者: gzbbxu    时间: 2013-6-27 13:57
王靖远 发表于 2013-6-27 13:52
这个反射得到的应该是没有泛型的吧。所以才能添加其他类型

你的意思我不太明白。我还是坚持我的。
作者: gzbbxu    时间: 2013-6-27 14:06
张承富 发表于 2013-6-27 13:36
你这个问题很笼统,泛型可以定义上下限
总之,在一个类的泛型中,只能添加你限定的泛型类型 ...

我想问的是,通过反射,泛型跳过编译阶段,算是可以添加其他类型的对象吗?
作者: gzbbxu    时间: 2013-6-27 16:50
怎么这个问题都没有好的答案呢?
作者: 郭伟杰    时间: 2013-6-28 11:35
不可以    添加的话  编译时会报告错误     
作者: 秩宇    时间: 2013-6-28 15:29
gzbbxu 发表于 2013-6-27 16:50
怎么这个问题都没有好的答案呢?

Java的泛型机制是只存在与编译阶段之前的,在编译器编译之后就会去掉泛型信息。所以,可以通过反射在运行时添加其他类型信息。不过,使用泛型就是为了更好的安全性,这么做就违背了它存在的意义了。
作者: 陈雨    时间: 2013-6-28 20:55
可以,泛型管的是编译时期,绕过编译时期就能添加,用反射获取method对象的add方法就能添加。
作者: 万琪    时间: 2013-6-29 09:27
。。呵呵。。泛型和反射是一对冤家啊,,

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

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

哈哈哈





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2