java - 从泛型类返回数组

标签 java

由于在运行代码时将 d 隐式转换为 double,因此在运行此代码时出现 ClassCastException 错误。但是,如果我将对 d 的引用更改为 Object[],那么它就不能成为 set 函数的参数。如果我更改 set 函数以接受 Object[] 那么一切正常,但是如果有人在不是 N< 类型的对象上调用 set ,则该类将在运行时失败.

我需要一个可以get() 旧数组(或其克隆)并且可以set() 数据到新数组的解决方案。

public class Foo<N> {

    public static void main(String[] args) {
        Foo<Double> foo = new Foo<Double>();
        Double[] d = foo.get();

        // do stuff to d ...

        foo.set(d);
    }

    N[] data;

    public Foo() {
        data = (N[]) new Object[2];
    }

    public N[] get() {
        return (N[]) data;
    }

    public void set(N[] data) {
        this.data = data;
    }

}

最佳答案

要创建具有正确运行时类型的数组,需要该类型的某种运行时表示。像 Foo<N> 这样的通用类没有 N 的运行时表示.

有两种解决方法:

  1. 使用 List<N>反而。如果可能的话,这是最好的!
  2. 手动添加 N 的运行时表示通过传入 Class<N>Foo , 使用 java.lang.reflect.Array.newInstance创建数组。

第二种方案的代码:

public Foo(Class<N> newDataClass) {
    data = (N[]) Array.newInstance(newDataClass, 2);
}

Foo<Double> foo = new Foo<>(Double.class);

编辑:

如果您想做的是获取现有 Double 的副本array 你可以用 (N[]) data.clone() 做到这一点.设置它不会有问题。

关于java - 从泛型类返回数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34450773/

相关文章:

java - lombok常量需要mvn安装

java - Kotlin 泛型转换为更具体的子类

java - log4j 2.17.0 更新问题 : ClassNotFoundException SetUtils

java - Web服务生命周期

java - 如何在 Grails 应用程序上使用 PDF 查看器预览 PDF

java - 如何在 Java 中将 ArrayList 列表写入 CSV 格式

java - Hibernate 在 PostgreSQL 中使用驼峰格式的主键

Java,从多个线程编辑数组

java - Jersey POST 方法参数作为类对象

java - 速率限制预防 [Twitter4J]