java泛型求教

dxlzanjie 2012-07-01 11:17:39
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了,为什么运行时会报错。
...全文
232 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
raistlic 2012-07-02
  • 打赏
  • 举报
回复
为什么你的 (T[])set.toArray(); 不行:

因为Java的泛型信息在编译的时候被抹掉了,set.toArray()被运行的时候,其内部实际建立的是new Object[set.size()],然后强制转换 Object[] 为 String[] 的时候出错。
raistlic 2012-07-02
  • 打赏
  • 举报
回复
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);
}
weiming453523782 2012-07-02
  • 打赏
  • 举报
回复
java 不支持泛型数组
dxlzanjie 2012-07-02
  • 打赏
  • 举报
回复
2楼的 编译报错 - -
dqsweet 2012-07-01
  • 打赏
  • 举报
回复
这样:

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

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧