Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何声明和实例化新的泛型数组?_Java_Arrays_Generics_Data Structures_Generic Programming - Fatal编程技术网

Java 如何声明和实例化新的泛型数组?

Java 如何声明和实例化新的泛型数组?,java,arrays,generics,data-structures,generic-programming,Java,Arrays,Generics,Data Structures,Generic Programming,我正在复习我的数据结构技能。我在网上找到了一本很棒的免费书,书名叫《读完后》,我正试图用提供的代码创建所有声明的数据结构,这样我就可以将它们灌输到我的记忆中 我遇到了一个“错误”,在我的一生中我都无法找出它:在ArrayStack(第2.1.2节)的resize()方法中,有一行代码-t[]b=newArray(Math.max(n*2,1))。关键在于,包含元素的数组既不太小也不太大。如果我使用这行代码,我会从Eclipse获得以下错误消息: 类型ArrayStack的方法newArray(i

我正在复习我的数据结构技能。我在网上找到了一本很棒的免费书,书名叫《读完后》,我正试图用提供的代码创建所有声明的数据结构,这样我就可以将它们灌输到我的记忆中

我遇到了一个“错误”,在我的一生中我都无法找出它:在
ArrayStack
(第2.1.2节)的
resize()
方法中,有一行代码-
t[]b=newArray(Math.max(n*2,1))。关键在于,包含元素的数组既不太小也不太大。如果我使用这行代码,我会从Eclipse获得以下错误消息:

类型ArrayStack的方法newArray(int)未定义。

所以,我想这一定是一个“打字错误”,意思是“新数组”。但修复此问题后,我会收到来自Eclipse的以下错误消息:

类型不匹配:无法从数组转换为T[]


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

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;
        }
}
import java.lang.reflect.Array;
公开课考试{
公共静态void main(字符串args[])引发异常{
对象数组[]=新对象[5];
数组=调整大小数组(数组,10);
for(对象o:array){
系统输出打印ln(o);
}
}
公共静电
T[]resizeArray(T[]a,int newSize)引发异常{
T[]b=(T[])Array.newInstance(a.getClass().getComponentType(),
新闻化);
for(int i=0;i
鉴于
T
的类别,我们称之为
klass

对于长度为
n
的一维数组:

T[] arr = (T[]) Array.newInstance(klass, n)
对于长度
nx m
的二维数组:

T[][] 2dArr = (T[][]) Array.newInstance(klass, n, m)
上面的函数实际上是两个不同的函数,一个接受
int
参数,另一个接受
int..
参数,您也可以将其作为数组传递。两者都返回一个
对象
,需要对其进行未选中的强制转换

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

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

这就是为什么您还需要将一个类型传递给集合.toArray(T[]arr)
,否则您会得到一个用于vanilla
toArray()
方法的
对象[]
,因为它不知道类型。

您想要的是:

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[]b=newArray(Math.max(n*2,1))只是提到我必须创建一个新数组?它本身不是这样做的代码吗?因此,我可能必须使用
java.lang.reflect.Array.newInstance()
来创建任意类型的数组。@AndroidStudent,我想是这样的。我只是在答案中添加了示例代码。我可以看出,这本书的作者不想在他的代码中加入那个怪物,因为这会分散他对当前主题的注意力。公平地说,这本书的作者应该指出他的代码无效,或者只是使用了
Object[]
。似乎有点草率。也许他们应该使用一种更好地支持参数化类型的语言…@AndroidStudent似乎
newArray()
是一种方法调用。但是,我无法在您链接的文本中找到它的定义位置。不,它不允许您对泛型执行此操作,它会显示以下错误消息:
无法创建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;
}
void T[] newArray(int size) {
    return (T[]) Array.newInstance( a.getClass().getComponentType(), size);
}