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);
}
这里是调用,编译器不会报错,但是运行时  String[] c = getDiffStrings(a);  这里报错, 说是Object不能转为String。不懂了,上面方法不是定义了 T了么,不是就代表String了,为什么运行时会报错。

解决方案 »

  1.   

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

  2.   

    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));
      }
    注意第一个办法里的 Class<T> type 不能用 args[0].getClass() 代替,原因如下:
      public static void main(String[] args) {
        
        Number[] a = { Integer.valueOf(1), Double.valueOf(2.0) };
        Number[] c = getDiff(a);
        
        for(Number s : c)
          System.out.println(s);
      }
      
      public static <T> T[] getDiff(T... args) {
        
        Set<T> set = new HashSet<T>(Arrays.asList(args));
        
        @SuppressWarnings("unchecked")
        T[] result = (T[])Array.newInstance(args[0].getClass(), set.size());
        
        return (T[])set.toArray(result);
      }
      

  3.   

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