数组的Java集合类型参数

数组的Java集合类型参数,java,class,generics,java-8,abstract-class,Java,Class,Generics,Java 8,Abstract Class,我想创建一个helper方法,它获取Collectiontype参数以返回列表。这就是我现在拥有的: public class Helper { public static <T> T[] CollectionToArray(Collection<T> collection) { return collection.stream().toArray(Object[]::new); // Error } public static

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

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
    }
}
公共类助手{
公共静态T[]集合到阵列(集合){
返回collection.stream().toArray(对象[]::new);//错误
}
公共静态T[]ListToArray(列表){
return list.stream().toArray(Object[]::new);//错误
}
}
公共类IAMSONOB{
公共空间请帮助我(){
列表=新的ArrayList();
Set=newhashset();
字符串[]arrayFromList=Helper.CollectionToArray(list);//错误
字符串[]arrayFromSet=Helper.CollectionToArray(集合);//错误
字符串[]数组=Helper.ListToArray(list);//错误
}
}
我的问题是:

  • 是否可以完成收集阵列(收集)?
    • 如果是,怎么做
    • 另外,是否可以首先将
      列表
      设置
      作为参数传递
  • 是否可以完成
    列表阵列(列表列表)
    • 如果是,怎么做
  • 但这里有一些限制,因为我个人的口味

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

  • 我有一种感觉,我需要修复部分
    对象[]::new
    通过使用类似的东西:
    不,如果可能的话,你绝对不能这么做库方法
    Collection.toArray()
    将为您提供与LHS相同的类型,但当您需要与LHS完全相同的类型时,您必须使用
    Collection.toArray(T[])
    (即使是
    ArrayStoreExceptions
    也会附带
    ArrayStoreExceptions,即由程序员为数组提供正确的类型),原因在于
    toArray()
    您已将
    对象[]
    指定为数组,以后不能将其强制转换为任何其他类型,否则将导致
    ClassCastException

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

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

    public static <T> T[] CollectionToArray(Collection<T> collection, T[] arr) {
    
                return collection.stream().toArray(value ->Arrays.copyOf(arr,collection.size()));
    
    
            }
    
    publicstatict[]CollectionToArray(集合集合,T[]arr){
    返回collection.stream().toArray(value->Arrays.copyOf(arr,collection.size());
    }
    
    并将其用作

    String[]arrayFromList=Helper.CollectionToArray(列表,新字符串[0])

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

    如果可以仅从泛型类型构造数组,
    Stream.toArray()
    不需要任何参数。您需要接受另一个参数。无论是
    T[]
    还是
    IntFunction
    @shmosel,未经检查的赋值
    (T[])集合.toArray()
    ?@nullpointer请求类CastException。仅仅使用
    集合.toArray(T[])
    有什么坏处?为什么不直接执行
    String[]arrayFromList=list.toArray(新字符串[0])?当标准库提供了经过测试、值得信赖且能做得很好的方法时,编写自己的方法背后的原因是什么?我删除了我的旧答案,因为它是错误的-谢谢你的答案:)