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了,为什么运行时会报错。
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了,为什么运行时会报错。
Set<Object> set = new HashSet<T>();
for(Object arg : args){
set.add(arg);
}
return (T[]) set.toArray();
}
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);
}