【问题标题】:Java creating a array of type generic [duplicate]Java创建一个泛型类型的数组[重复]
【发布时间】:2013-12-13 01:52:01
【问题描述】:

我有一个通用的 K 并希望创建一个空数组,所以我键入

private K[] keys   = new K[0];

但是 eclipse 说“无法创建 K 的通用数组”

我错过了什么吗?你可以创建一个空的int数组,这是泛型做不到的吗?

【问题讨论】:

    标签: java


    【解决方案1】:

    您不能在 Java 中创建泛型数组。一种解决方法是:

    keys = (K[])new Object[size]; 
    

    虽然这会产生编译器警告。

    一般来说,这不是一个好的做法,而且这样做也不安全。有关更多信息,请参阅this 线程。

    但是,如果您无法避免,则只能与 new 一起使用,因为将 Object 数组转换为 K[] 可能会用于插入您不喜欢的内容。

    更新

    但实际上,正如您在this 中看到的那样,java.lang.reflect.Array.newInstance() 可能是使用反射库更安全的方式。

    【讨论】:

    • 这一般安全吗?或者对象的转换和使用是否会导致极端情况?
    • @Zimm3r 你是对的。可能不会。我已经更新了我的答案。
    【解决方案2】:

    如果K 是抽象的怎么办?执行者如何知道如何填充任何缺失的方法?

    另外,由于编译时的类型擦除,如果不与其他类进行比较,您将无法判断 K 实际上是什么类,这需要一个实例。

    Type erasure

    【讨论】:

    • 抽象K 不是问题,就像创建List[] 是问题一样。您可以创建一个抽象类(或接口)的数组,因为该数组不需要知道其元素的实现是什么。
    • @yshavit 这只是一个例子。主要概念是缺少不可用的信息。
    • 是的,但它与擦除(您链接到的)有关,与 K 可能是抽象的无关。这就是我要说的。
    【解决方案3】:

    你可以使用Array.newInstance() 方法来实现这样的事情;考虑

    public class Question<K> {
      private K[] keys;
    
      @SuppressWarnings("unchecked")
      public Question(Class<? extends K> cls, int size) {
        this.keys = (K[]) Array.newInstance(cls, size);
      }
    
      public K[] getKeys() {
        return keys;
      }
    
      public static void main(String[] args) {
        Question<String> question = new Question<String>(
            String.class, 10);
        String[] keys = question.getKeys();
        keys[0] = "Hello";
        keys[1] = "World";
        keys[2] = "Goodbye";
        keys[3] = "I must";
        keys[4] = "be Going";
        keys[5] = "Now";
        keys[6] = "Parting";
        keys[7] = "is";
        keys[8] = "such";
        keys[9] = "sweet sorrow";
        System.out.println(Arrays.toString(question
            .getKeys()));
      }
    }
    

    这是打印出来的

    [Hello, World, Goodbye, I must, be Going, Now, Parting, is, such, sweet sorrow]
    

    【讨论】:

    • 相当肯定不允许使用它。我们不允许使用内置的 java 存储类。 (虽然我假设我们可以使用数组意义,否则处理指针等会相当不便)。
    • 这是使用Java反射来构造对象数组。这是你可以做到的。
    • @ElliottFrisch 你说得对,java.lang.reflect.Array 也可以。在我的回答中,我只是认为 new K[size] 不能在 java 中说,并且想到的直接解决方法:) 这绝对更安全。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-06
    • 2011-10-27
    • 2011-07-22
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    相关资源
    最近更新 更多