问一个关于泛型的类型转化问题

rangerheart 2008-03-17 09:39:10
大家都知道,泛型数组是不能直接用new分配空间的,只有先通过以Object数组方式分配空间再强制转化为泛型。
但是当我用了比较复杂的泛型参数时,出现了ClassCastException的异常,代码如下

public class Test {
public static void main(String[] args){
Test.<Integer>test();
}
public static <T extends Comparable<T>> void test() {
T[] result = (T[]) new Object[10];
}
}

如果<T extends Comparable<T>>改为<T>的话就可以顺利执行,想了半天还是找不出问题,望高手指教,谢谢。
...全文
143 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
rangerheart 2008-03-17
  • 打赏
  • 举报
回复
哦,终于发现一个方法了,因为突然想到可以用接口名来生成对象,于是抱着试一下的感觉直接用Comparable来实例化数组,没想到竟然成功了,而且也赋值也没有问题。

public static <T extends Comparable <T> > void test() {
T[] result = (T[]) new Comparable[10];
}
rangerheart 2008-03-17
  • 打赏
  • 举报
回复
还是有个问题,如果利用函数传递一个参数 test(T[] data)

然后再函数内利用data给我们生成的reslut数组赋值 result[0]=data[0];

这里会发生ArrayStoreException异常,晕...

感觉泛型这个东西入门简单,要精通还是很难啊。
ooo19841080xinxin 2008-03-17
  • 打赏
  • 举报
回复
完全看不懂什么意思
rangerheart 2008-03-17
  • 打赏
  • 举报
回复
恩,按照你的思路定义了一个MyObject继承了Object,实现了Comparable<T>,现在可以用了,感谢哈
dracularking 2008-03-17
  • 打赏
  • 举报
回复
扩展一个Comparable型吧

public class Test {
public static void main(String[] args) {
Test.<MyInteger> test();
}

public static <T extends Comparable<T>> void test() {
T[] result = (T[]) new MyInteger[10];
result[0] = (T) new MyInteger(1);
System.out.println(((MyInteger) result[0]).getValue());
}
}

class MyInteger implements Comparable{
int value;

MyInteger(int value){
this.value = value;
}

public void setValue(int value){
this.value = value;
}

public int getValue(){
return value;
}

public int compareTo(Object o) {
// TODO Auto-generated method stub
return 0;
}
}
rangerheart 2008-03-17
  • 打赏
  • 举报
回复
恩,应该是这个原因!!

但是,这样的话我要在test()中新建一个T的泛型数组,应该怎么解决呢?泛型参数需要是<T extends Comparable<T>>,因为后面会涉及比较。
dracularking 2008-03-17
  • 打赏
  • 举报
回复
我想是因为Object和Comparable型之间转换障碍所致

public class Test {
public static void main(String[] args) {
Test.<String> test();
}

public static <T extends Comparable<T>> void test() {
T[] result = (T[]) new String[10];
result[0] = (T) new String("1");
System.out.println(result[0]);
}
}


理由是换成这样就ok

62,623

社区成员

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

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