List接口中 T[] toArray(T[] a)方法疑问?

sunrubben 2011-01-12 07:18:31
Java开发实战经典里P498有这段代码:

import java.util.ArrayList ;
import java.util.List ;
public class ArrayListDemo04{
public static void main(String args[]){
List<String> allList = null ;
allList = new ArrayList<String>() ; // 指定操作的泛型为String
allList.add("Hello") ; // 此方法由Collection接口而来
allList.add(0,"World") ; // 在第一个位置上添加新的内容
allList.add("MLDN") ; // 向Collection中加入内容
allList.add("www.mldn.cn") ;
String str[] = allList.toArray(new String[]{}) ; // 指定好类型
System.out.print("指定数组类型:") ;
for(int i=0;i<str.length;i++){
System.out.print(str[i] + "、") ;
}
System.out.print("\n返回对象数组:") ;
Object obj [] = allList.toArray() ; // 返回Object类型
for(int i=0;i<obj.length;i++){
String temp = (String)obj[i] ; // 进行向下转型
System.out.print(temp + "、") ;
}
}
};

请问 划红线那句代码什么意思??怎么使用了new String[]{}??
...全文
1091 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
qybao 2011-09-11
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 percyboy 的回复:]
如果是为了向后兼容,java为何不选择用如下的方式呢:
String str[] = allList.toArray(String.class);

只是为了知道数组元素类型嘛,直接给它个class也比传个空数组优雅。。
[/Quote]
当初如果想这样做也不是不可以,比如
    public <T> T[] toArray(Class<T> clazz) {
//if (a.length < size)
T[] a = (T[])java.lang.reflect.Array.newInstance(clazz, size);
System.arraycopy(elementData, 0, a, 0, size);
return a;
}
Firebirds 2011-09-10
  • 打赏
  • 举报
回复
<T> T[] toArray(T[] a)
Returns an array containing all of the elements in this list in proper sequence (from first to last element); the runtime type of the returned array is that of the specified array.

通过参数类型来确定返回值类型。

-------String str[] = allList.toArray(new String[]{}) ; // 指定好类型
-------将allList中的元素按集合中的顺序以String[]形式返回。
daijope 2011-09-10
  • 打赏
  • 举报
回复
List中的对象是Object的,按道理将转换的时候每一项都要强制类型转化,加上后面的类型相当于这个功能吧,可以这样理解。
syoumei 2011-09-10
  • 打赏
  • 举报
回复
楼上的各位,为什么源代码里强制转换没有一个警告?
龙四 2011-09-09
  • 打赏
  • 举报
回复
这种方式怎么搞?方法定义返回结果怎么定义?还得是Object[],还得强制转换!那直接toArray()方法不就解决掉了?多加这个不是画蛇添足!

只有泛型才能使得返回结果不用强制转换

[Quote=引用 11 楼 percyboy 的回复:]

如果是为了向后兼容,java为何不选择用如下的方式呢:
String str[] = allList.toArray(String.class);

只是为了知道数组元素类型嘛,直接给它个class也比传个空数组优雅。。
[/Quote]
龙四 2011-09-09
  • 打赏
  • 举报
回复
这种方式怎么搞?方法定义返回结果怎么定义?还得是Object[],还得强制转换!那直接toArray()方法不就解决掉了?多加这个不是画蛇添足!

只有泛型才能使得返回结果不用强制转换

[Quote=引用 11 楼 percyboy 的回复:]

如果是为了向后兼容,java为何不选择用如下的方式呢:
String str[] = allList.toArray(String.class);

只是为了知道数组元素类型嘛,直接给它个class也比传个空数组优雅。。
[/Quote]
softroad 2011-09-09
  • 打赏
  • 举报
回复
lz可以看看源码就知道怎么回事了。


public <T> T[] toArray(T[] a) {
if (a.length < size)
a = (T[])java.lang.reflect.Array.
newInstance(a.getClass().getComponentType(), size);
System.arraycopy(elementData, 0, a, 0, size);
if (a.length > size)
a[size] = null;
return a;
}


percyboy 2011-09-09
  • 打赏
  • 举报
回复
如果是为了向后兼容,java为何不选择用如下的方式呢:
String str[] = allList.toArray(String.class);

只是为了知道数组元素类型嘛,直接给它个class也比传个空数组优雅。。
iambic 2011-01-12
  • 打赏
  • 举报
回复
如果说“假如以绝大多数都传入0长度代码做为推出后面结论的依据”,“依据本身就不是分妥当”,那么“其实用的不对”这种说法,就更谈不上妥当了。
qybao 2011-01-12
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 iambic 的回复:]
谁来解释下为什么Java要用传0长度数组这种愚蠢的方法来实现简单的强类型数组转换?
[/Quote]
因为方法的需要,方法就是这么定义的
T[] toArray(T[] a) 参数传入一个数组,输出和参数同类型的数组,该参数相当于告诉方法要转为什么类型,所以一般传入个0长度的数组就可以了,即代码中的new String[]{}或new String[0]
或许方法定义为toArray(Class<T>)会好理解一些,可能是考虑兼容的问题吧
之前的版本应该是Object[] toArray(Object[] a)
疯癫行者 2011-01-12
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 iambic 的回复:]

谁说用的不对。绝大多数实际使用的代码都是传0长度的数组。问题是你toArray就toArray呗,自动生成一个array就是了,还非要用户指定一个,指定的长度还是0,这不是笑话嘛。哈哈哈哈。
[/Quote]
to一个什么类型的Array啊?在java泛型出来之前,这种做法恐怕是比较好的做法了。
假如以绝大多数都传入0长度代码做为推出后面结论的依据,恐怕也说不过去,因为依据本身就不是分妥当,是吧?!
iambic 2011-01-12
  • 打赏
  • 举报
回复
谁说用的不对。绝大多数实际使用的代码都是传0长度的数组。问题是你toArray就toArray呗,自动生成一个array就是了,还非要用户指定一个,指定的长度还是0,这不是笑话嘛。哈哈哈哈。
疯癫行者 2011-01-12
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 iambic 的回复:]

谁来解释下为什么Java要用传0长度数组这种愚蠢的方法来实现简单的强类型数组转换?
[/Quote]
我来解释,就如我在三楼说的那样,其实用的不对,不该传入零长度数组,传入实际长度数组就没有这个问题了。
龙四 2011-01-12
  • 打赏
  • 举报
回复
因为java历史原因。。。
而又必须向下兼容,现在当然有泛型之类的,可以实现的更美一点

但是在那个黑暗的21世纪。。。(以下省略万字)

[Quote=引用 4 楼 iambic 的回复:]

谁来解释下为什么Java要用传0长度数组这种愚蠢的方法来实现简单的强类型数组转换?
[/Quote]
iambic 2011-01-12
  • 打赏
  • 举报
回复
谁来解释下为什么Java要用传0长度数组这种愚蠢的方法来实现简单的强类型数组转换?
疯癫行者 2011-01-12
  • 打赏
  • 举报
回复
一楼正解。
补充一下:如果只传入一个零长度的数组,就像代码中的那样“new String[]{}”,那么还需要在创建一个allList长度的String数组对象存储返回值,就会多创建一个零长度的String数组对象。
假如传入把allList的长度也传入,就像这样“new String[allList.size()]”,那么allList的内容就会直接存入该数组对象,那么就少创建一个对象了。
jsut_yi 2011-01-12
  • 打赏
  • 举报
回复
该方法是根据集合中元素的类型,传入一个相同类型的零长度的数组。返回一个指定类型的数组。
如果传入的数组类型与集合中的元素类型不相符那么就会抛出java.lang.ArrayStoreException异常
huntor 2011-01-12
  • 打赏
  • 举报
回复
这个方法一般传入一个零长度的数组,指定返回类型。

62,614

社区成员

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

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