首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

java泛型求教,该怎么处理

2012-07-15 
java泛型求教Java codepublic static T T[] getDiff(T[] args){SetT set new HashSetT()for(T ar

java泛型求教

Java code
public static <T> T[] getDiff(T[] args){        Set<T> set = new HashSet<T>();        for(T arg : args){            set.add(arg);        }        return (T[]) set.toArray();    }


上面是自己想的定义了一个数组去重复的方法,想写个各种类型通用的。

Java code
public static void main(String[] args){        String[] a = {"1", "2", "1","3","1", "2"};        String[] c = getDiff(a);    }

这里是调用,编译器不会报错,但是运行时 String[] c = getDiffStrings(a); 这里报错, 说是Object不能转为String。

不懂了,上面方法不是定义了 T了么,不是就代表String了,为什么运行时会报错。

[解决办法]
这样:
Java code
public static <Object> T[] getDiff(T[] args){        Set<Object> set = new HashSet<T>();        for(Object arg : args){            set.add(arg);        }        return (T[]) set.toArray();    }
[解决办法]
java 不支持泛型数组
[解决办法]
3楼说的对,下面是两种折中的办法:

Java code
  public static <T> T[] getDiff(Class<T> type, T... args) {        Set<T> set = new HashSet<T>(Arrays.asList(args));        @SuppressWarnings("unchecked")    T[] result = (T[])Array.newInstance(type, set.size());        return (T[])set.toArray(result);  }    public static <T> Set<T> getDiff(T... args) {        return new HashSet<T>(Arrays.asList(args));  }
[解决办法]
为什么你的 (T[])set.toArray(); 不行:

因为Java的泛型信息在编译的时候被抹掉了,set.toArray()被运行的时候,其内部实际建立的是new Object[set.size()],然后强制转换 Object[] 为 String[] 的时候出错。

热点排行