有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

将Java集合类型参数类设置为数组

我想创建一个helper方法,它获取Collection类型参数以返回一个列表。这就是我现在拥有的:

public class Helper {
    public static <T> T[] CollectionToArray(Collection<T> collection) {
        return collection.stream().toArray(Object[]::new); // Error
    }

    public static <T> T[] ListToArray(List<T> list) {
        return list.stream().toArray(Object[]::new); // Error
    }
}

public class IamSoNoob {
    public void PleaseHelpMe() {

        List<String> list = new ArrayList<>();
        Set<String> set = new HashSet<>();

        String[] arrayFromList = Helper.CollectionToArray(list); // Error
        String[] arrayFromSet = Helper.CollectionToArray(set); // Error

        String[] array = Helper.ListToArray(list); // Error
    }
}

我的问题是:

  1. 是否可以完成CollectionToArray(Collection<T>)
    • 如果是,怎么做
    • 另外,是否可以首先将ListSet作为参数传递
  2. 是否可以完成ListToArray(List<T> list)
    • 如果是,怎么做

但这里有一些限制,因为我个人的口味

  1. 我不想使用@SuppressWarnings
  2. 我真的想保留部分.stream().toArray(Object[]::new)(Java8部分!)

我有一种感觉,我需要通过使用类似:<T extends Object><? extends T>的东西来修复部分Object[]::new,但我真的搞不清楚

请帮助我,并请提供一个解释,我经常被Generic?弄糊涂


共 (1) 个答案

  1. # 1 楼答案

    不,你绝对不能这样做,如果有可能的话,库方法Collection.toArray()会给你与你的LHS相同的类型,但是当你想要与你的LHS完全相同的类型时,你必须使用Collection.toArray(T[])(即使是ArrayStoreExceptions附带的,也就是说,由程序员为数组提供正确的类型),原因是,在toArray()中,您指定了Object[]作为数组,以后不能将其强制转换为任何其他类型,否则将导致ClassCastException

    之所以如此喧嚣,是因为泛型的工作方式,也就是说,它是编译时的事情,在运行时Java会将所有类型参数擦除为它们的上限类型,从而丢失创建数组所需的类型信息

    一种安全的方法是向助手方法添加另一个参数,如下所示:

    public static <T> T[] CollectionToArray(Collection<T> collection, T[] arr) {
    
                return collection.stream().toArray(value ->Arrays.copyOf(arr,collection.size()));
    
    
            }
    

    并将其用作

    String[] arrayFromList = Helper.CollectionToArray(list, new String[0]);

    不过大家最好还是使用 Collection#toArray(T[])