日期:2014-05-20  浏览次数:20670 次

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[] 的时候出错。