【发布时间】:2017-02-05 15:03:54
【问题描述】:
我昨天在写作业时遇到了一个问题。我完成了作业,但我仍然不明白为什么我的代码有效。我必须编写一个排序函数,它将任何可比较的通用对象的可变参数作为参数并返回参数。问题是我必须返回一个排序对象数组。所以我不得不学习更多关于可变参数列表和数组的知识。
函数是这样定义的。
public <T extends Comparable<T>> T[] stableSort(T ... items)
在函数内部,我创建了一个列表,我会对它进行排序并完成所有工作。
List<T> list = new ArrayList<T>(Arrays.asList(items));
在函数的最后,我返回了 list toArray 以便它匹配输出类型 T[]。
list.toArray(items.clone());
我的问题是,既然我已经从可变参数中创建了列表,为什么我必须在 toArray 函数中执行 items.clone() 。这似乎对我做了两件事。我认为arrays.asList() 会将数组的值克隆到列表中,但我不明白为什么要在 toArray() 中的代码末尾再次这样做。我知道这是正确的写法,因为我昨天完成了作业,从班上的论坛上找到了这种写法,但我仍然不明白为什么。
编辑
该任务要求我创建一个包含已排序文件的新数组并将其返回。由于类型擦除,如果没有对适合泛型的类的引用,就无法实例化泛型类型的数组。但是,可变参数数组的类型为 T,所以我应该克隆一个符合泛型约束的类型的数组。我不知道该怎么做。所以我决定使用列表来让我在截止日期前的时间更轻松。
【问题讨论】:
-
区别在于
asList返回List,而toArray返回数组。 -
@Andremoniy 我认为问题是为什么要克隆?
-
这似乎毫无意义。该数组被包装为一个不需要的列表,但只是为了确保它被包装在另一个列表中,也不需要,然后克隆该数组,该数组创建一个包含所有项目的数组,但将所有项目复制到其中刚刚创建的列表,即相同的项目。
-
@Andremoniy 查看我的回答以了解为什么需要这样做。
-
为什么是近距离投票?这个问题只需要仔细阅读并将自己移入仍在学习理解为什么会出现混乱的人的脑海中。此外,@PeterLawrey 认为其中一些步骤是不必要的,这表明对其中一些方法缺乏了解。就像 asList 实际上是底层数组的视图并传递更改,而 toArray 可能(但不总是)返回作为参数提供的数组。
标签: java arrays list generics variadic-functions