1

我正在复习我的数据结构技能。我在网上找到了一本很棒的免费书籍,名为Open Data Structures in Java。通读后,我尝试使用提供的代码创建所有声明的数据结构,以便将它们灌输到我的记忆中。

我遇到了一个“错误”,我一辈子都想不通:在(第 2.1.2 节)的resize()方法中ArrayStack,有一行代码 - T[] b = newArray(Math.max(n*2,1));。这样做的重点是包含元素的数组既不会太小也不会太大。如果我使用这行代码,我会从 Eclipse 收到以下错误消息:

The method newArray(int) is undefined for the type ArrayStack<T>.

所以,我认为它一定是一个“错字”,意思是“新数组”。但是修复它会给我留下来自 Eclipse 的以下错误消息:

Type mismatch: cannot convert from Array to T[].

我不明白我错过了什么或做错了什么。所以总结一下我的问题,你如何声明和实例化一个新的通用数组,特别是在固定大小的情况下?

4

3 回答 3

2

给定 的类T,我们称它为klass...

对于长度为 的一维数组n

T[] arr = (T[]) Array.newInstance(klass, n)

对于长度为 的二维数组n x m

T[][] 2dArr = (T[][]) Array.newInstance(klass, n, m)

上面其实是两个不同的函数,一个带int参数,第二个带int...参数,也可以作为数组传递。两者都返回Object你需要未经检查的演员表。

如果你想要一个长度为锯齿状的数组n,第二维不确定,你将不得不得到 的类T[],我们称之为它klass2,然后做

T[][] 2dArr2 = (T[][]) Array.newInstance(klass2, n)

这就是为什么您还需要将类型传递给collection.toArray(T[] arr),否则您会得到一个Object[]for vanillatoArray()方法,因为它不知道类型。

于 2013-02-21T01:52:06.670 回答
1

你想要的是:

void resize() {
    T[] b = new T[Math.max(n*2,1)];
    for (int i = 0; i < n; i++) {
        b[i] = a[i];
    }
    a = b;
}

但这不起作用,因为 T 在运行时实际上并不知道,而且它必须是。然而,这可以用一个通用安全的构造函数来编写。

void resize() {
    T[] b = (T[]) Array.newInstance( a.getClass().getComponentType(),
                                     Math.max(n*2,1) );
    for (int i = 0; i < n; i++) {
        b[i] = a[i];
    }
    a = b;
}

看来作者打算在该类中有一个方法 newArray :

void T[] newArray(int size) {
    return (T[]) Array.newInstance( a.getClass().getComponentType(), size);
}
于 2013-02-21T01:57:03.537 回答
0

Java 并没有使这成为一件简单的事情。由于类型擦除, T 的类在运行时不可用(此时您需要确定要创建的数组类型)。

但是,由于您已经有一个数组 ( a),您可以使用反射来创建该类型的新数组。

它看起来像这样:

import java.lang.reflect.Array;

public class Test {

        public static void main(String args[]) throws Exception {
                Object array[] = new Object[5];

                array = resizeArray(array, 10);

                for (Object o : array) {
                        System.out.println(o);
                }
        }

        public static <T>
        T[] resizeArray(T[] a, int newSize) throws Exception {
                T[] b = (T[]) Array.newInstance(a.getClass().getComponentType(),
                                                newSize);

                for (int i = 0; i < a.length; i++) {
                        b[i] = a[i];
                }

                return b;
        }
}
于 2013-02-21T01:34:50.397 回答