使用泛型时,是否可以在 Java 的方法中 return 类型 <E> 的数组而不是对象数组?
Is it possible to return an array of type <E> in a method in Java rather than an array of objects when using Generics?
我有一个方法,它接受一个数组并以随机顺序将其复制到另一个数组中,然后 return 将随机排列的数组保存下来。
但是,如果我想让它成为泛型,我无法创建第二个 E 类型的数组。
为了解决这个问题,我尝试使用 Arraylist,然后使用 .toArray() 方法并将其转换为 E 类型,但是 return 是一个对象数组。
我目前的解决方案是直接修改数组 return,但是有没有办法 return 一个正确类型的数组,也就是传递给方法?
import java.util.ArrayList;
import java.util.Arrays;
public class ShuffleArray
{
public static void main(String[] args)
{
String[] list = {"bob", "maryo", "john", "david", "harry"};
//doesn't work, can't store array of objects in array of strings
list = shuffle(list);
//works because I modify directly
shuffle(list);
}
public static <E> E[] shuffle(E[] list)
{
ArrayList<E> shuffledList = new ArrayList<>();
//shuffle the array
while (shuffledList.size() != list.length)
{
int randomIndex = (int)(Math.random() * list.length);
if (!shuffledList.contains(list[randomIndex]))
{
shuffledList.add(list[randomIndex]);
}
}
//overwrites the initial values of the array with the shuffled ones
for (int i = 0; i < list.length; i++)
{
list[i] = shuffledList.get(i);
}
//How do I make this return an array of type String?
return (E[]) shuffledList.toArray();
}
}
是啊,你为什么不创建一个 E 类型的数组并将值存储在其中
E[] array = new E[list.length];
然后只使用该数组存储打乱后的值,return它
你有一个不同的问题,这里描述得更好:make arrayList.toArray() return more specific types
将您的 return 语句更改为以下内容
return shuffledList.toArray(E[]::new);
你可以使用 Arrays.copyOf:
shuffledList.toArray(Arrays.copyOf(list, list.length));
尽管该方法在内部也使用转换。
对了,还有一个built-in方法Collections.shuffle。也许最好的方法是处理列表而不是原始数组?
UPDATE:要使 copyOf 方法起作用,您需要将类型参数绑定到对象,即将其从 <E>
更改为 <E extends Object>
。该方法不适用于原始类型(int、long 等)。
所有数组都有一个public clone()
方法,returns与原始数组类型相同:
return shuffledList.toArray(list.clone());
我有一个方法,它接受一个数组并以随机顺序将其复制到另一个数组中,然后 return 将随机排列的数组保存下来。
但是,如果我想让它成为泛型,我无法创建第二个 E 类型的数组。 为了解决这个问题,我尝试使用 Arraylist,然后使用 .toArray() 方法并将其转换为 E 类型,但是 return 是一个对象数组。
我目前的解决方案是直接修改数组 return,但是有没有办法 return 一个正确类型的数组,也就是传递给方法?
import java.util.ArrayList;
import java.util.Arrays;
public class ShuffleArray
{
public static void main(String[] args)
{
String[] list = {"bob", "maryo", "john", "david", "harry"};
//doesn't work, can't store array of objects in array of strings
list = shuffle(list);
//works because I modify directly
shuffle(list);
}
public static <E> E[] shuffle(E[] list)
{
ArrayList<E> shuffledList = new ArrayList<>();
//shuffle the array
while (shuffledList.size() != list.length)
{
int randomIndex = (int)(Math.random() * list.length);
if (!shuffledList.contains(list[randomIndex]))
{
shuffledList.add(list[randomIndex]);
}
}
//overwrites the initial values of the array with the shuffled ones
for (int i = 0; i < list.length; i++)
{
list[i] = shuffledList.get(i);
}
//How do I make this return an array of type String?
return (E[]) shuffledList.toArray();
}
}
是啊,你为什么不创建一个 E 类型的数组并将值存储在其中
E[] array = new E[list.length];
然后只使用该数组存储打乱后的值,return它
你有一个不同的问题,这里描述得更好:make arrayList.toArray() return more specific types
将您的 return 语句更改为以下内容
return shuffledList.toArray(E[]::new);
你可以使用 Arrays.copyOf:
shuffledList.toArray(Arrays.copyOf(list, list.length));
尽管该方法在内部也使用转换。
对了,还有一个built-in方法Collections.shuffle。也许最好的方法是处理列表而不是原始数组?
UPDATE:要使 copyOf 方法起作用,您需要将类型参数绑定到对象,即将其从 <E>
更改为 <E extends Object>
。该方法不适用于原始类型(int、long 等)。
所有数组都有一个public clone()
方法,returns与原始数组类型相同:
return shuffledList.toArray(list.clone());