Java:通用方法 - 将元素添加到 vararg

标签 java generics methods

我想在这里这样做,它实际上有效,但不知何故我不认为这是一个好的解决方案:

class A5<T> implements A4<T> {

    private final T[] elements;

    A5(T... elements) {
        this.elements = elements;
    }


    public <R> A5<R> map(Function<T, R> function) {
        List<R> liste = new LinkedList<>();
        for (T element : elements) {
            liste.add(function.apply(element));
        }
        Object[] objects = new Object[liste.size()];
        int counter = 0;
        for (R element : liste) {
            objects[counter] = liste.get(counter++);
        }
        return new A5(objects);
    }
}

对我来说,Object[] 是一个问题,但我无法创建 R[] 数组。有人有解决办法吗?更改 CTOR 和 map 签名不是我想要的。只能改变 body 。

最佳答案

您无法创建通用数组,因此除非您更改 T[]List<T>上课A5您需要创建一个 Object[]

不过你的代码可以简化一点。您可以使用 Java 8 Stream 来映射元素并将它们收集到 Object[]然后转换此 Object[]R[]@SuppressWarnings("unchecked")隐藏未经检查的强制转换产生的警告:

class A5<T> implements A4<T> {

    private final T[] elements;

    A5(T... elements) {
        this.elements = elements;
    }

    @SuppressWarnings("unchecked")
    public <R> A5<R> map(Function<T, R> function) {
        return new A5<>((R[]) Arrays.stream(elements).map(function).toArray());
    }
}

关于Java:通用方法 - 将元素添加到 vararg,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38329548/

相关文章:

java - 如何获取泛型方法参数的类型参数类?

java - 用Java扫描文本文件

java - Mockito.any() 通过泛型接口(interface)

java - 类未在 spring-boot 中实例化(j2EE 到 spring-boot 迁移)

java - 泛型类<?扩展编号> 说明

java - 具有静态方法的数组

c# - 具有异常处理的方法参数

javascript - 包含对象的 JSON 的迭代

java - 在 Google 应用引擎上部署失败

java - 无法加载CSS文件Java Spring