黑马程序员技术交流社区

标题: Java 泛型问题 [打印本页]

作者: wconho    时间: 2014-3-27 22:03
标题: Java 泛型问题
本帖最后由 wconho 于 2014-3-28 11:41 编辑

package gg.dao;
import java.util.ArrayList;

public class GenericTest {
        public static void main(String[] args)throws Exception{
        
                //使用反射向泛型集合中添加其他元素
               
                //泛型变量是:String时,通过使用反射向集合填入整数12 ,获取集合元素时出错??
                ArrayList<String> array1 = new ArrayList<String>();               
                array1.getClass().getMethod("add",Object.class).invoke(array1,12);        
                System.out.println(array1.get(0));
               
                //错误提示:Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
               
                //泛型变量是:Integer,通过使用反射向集合填入字符串,在获取集合元素时,就没有出错呢?
                ArrayList<Integer> array2 = new ArrayList<Integer>();
                array2.getClass().getMethod("add",Object.class).invoke(array2,"acc");               
                System.out.println(array2.get(0));
                //打印出:acc
        }
}
作者: 霍振鹏    时间: 2014-3-28 00:35
这样改一下就可以了,那么为什么要这么该呢?后面解释
  1. package gg.dao;
  2. import java.util.ArrayList;

  3. public class GenericTest {
  4.         public static void main(String[] args)throws Exception{
  5.         
  6.                 //使用反射向泛型集合中添加其他元素
  7.                
  8.                 //泛型变量是:String时,通过使用反射向集合填入整数12 ,获取集合元素时出错??
  9.                 ArrayList<String> array1 = new ArrayList<String>();               
  10.                 array1.getClass().getMethod("add",Object.class).invoke(array1,12);  
  11.                
  12.               
  13.                 System.out.println(String.valueOf(array1.get(0)));
  14.             
  15.                
  16.                 //错误提示:Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
  17.                
  18.                 //泛型变量是:Integer,通过使用反射向集合填入字符串,在获取集合元素时,就没有出错呢?
  19.                 ArrayList<Integer> array2 = new ArrayList<Integer>();
  20.                 array2.getClass().getMethod("add",Object.class).invoke(array2,"acc");               
  21.                 System.out.println(array2.get(0));
  22.                 //打印出:acc
  23.         }
  24. }
复制代码


首先必须知道并不是get方法导致的错误,而是println方法导致的,为什么会导致呢?看一下这个图片,它接受的是一个String类型的参数


这就相当于 String str=12这么写,肯定会出错所以String str=String.Valueof(12);

13.png (5.5 KB, 下载次数: 21)

13.png





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