使用泛型时,是否可以在 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());