日期:2014-05-20 浏览次数:20692 次
public static <T> T[] getDiff(T[] args){ Set<T> set = new HashSet<T>(); for(T arg : args){ set.add(arg); } return (T[]) set.toArray(); }
public static void main(String[] args){ String[] a = {"1", "2", "1","3","1", "2"}; String[] c = getDiff(a); }
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楼说的对,下面是两种折中的办法:
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[] 的时候出错。