从泛型类返回一个数组。如何在 main 方法中打印数组中的数据?

2024-02-22

我似乎无法理解应该如何使用返回的数组returnItems()在主要方法中。我对泛型类型有点害怕。如果我继续实现成为一名 Java 开发人员的梦想,我就会失去信心。当我阅读专业人士的一些代码时,他们似乎喜欢使用泛型,但我发现它非常令人生畏。如果我能得到一份关于我可以轻松理解的泛型的良好参考,我将不胜感激。

public class Generic<T> {
    private int pos;
    private final int size;
    private T[] arrayOfItems;
    public Generic(int size)
    {
        this.size = size;
        pos = 0;
        arrayOfItems = (T[]) new Object[size];
    }
    public void addItem(T item)
    {
        arrayOfItems[pos] = item;
        pos++;
    }
    public void displayItems()
    {
        for(int i = 0;i<pos;i++){
        System.out.println(arrayOfItems[i]);
        }
    }
    public T[] returnItems()
    { 
        return arrayOfItems;
    }
}


public class GenericTesting {
    public static void main(String[] args) {
        Generic<String> animals = new Generic<String>(5);
        Generic<Integer> numbers = new Generic<Integer>(5);
        animals.addItem("Dog");
        animals.addItem("Cat");
        animals.addItem("Bird");
        animals.addItem("Mouse");
        animals.addItem("Elephant");
        animals.displayItems();

        numbers.addItem(1);
        numbers.addItem(2);
        numbers.addItem(3);
        numbers.displayItems();

        for(int i=0; i < animals.returnItems().length;i++)
        {
            System.out.println(animals.returnItems[i]);
        }
    }

}

returnItems()是一个返回数组的方法,而不是数组本身,因此您不能像在这里尝试那样尝试引用它的索引:

        System.out.println(animals.returnItems[i]);

您需要做的是引用从方法返回的数组上的索引,如下所示:

        System.out.println(animals.returnItems()[i]);

Edit

您存储数据和返回数据的方式也存在问题。在你的构造函数中你创建arrayOfItems作为一个数组Object:

        arrayOfItems = (T[]) new Object[size];

...但是你尝试将其作为数组返回T in returnItems():

public T[] returnItems()
{ 
    return arrayOfItems;
}

当您尝试运行代码时,您将收到异常:

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;

这是由于一种叫做类型擦除 http://docs.oracle.com/javase/tutorial/java/generics/erasure.html。基本上,Java 编译器将用普通类替换所有泛型类型(Object在本例中),并插入强制转换以保持类型安全。

所以这行来自你的main() method:

    for(int i=0; i < animals.returnItems().length;i++)

将会看到animals is a Generic<String>,并变成这样:

    for(int i=0; i < ((String[])animals.returnItems()).length;i++)

但是您返回的数组是作为new Object[], not a new String[],除非该对象实际上是子类型,否则不能向下转换,因此会出现异常。

为了消除ClassCastException,你可以改变returnItems()像这样声明它的实际返回类型:

    public Object[] returnItems()
    { 
        return arrayOfItems;
    }

这将阻止编译器尝试插入数组的非法转换,但随后您需要手动将每个元素转换为适当的类型,这首先违背了使用泛型的目的。

正如 JBNizet 在上面的评论中指出的,数组和泛型“不能很好地结合在一起”,所以你最好使用ArrayList<T>代替T[]来存储您的数据。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从泛型类返回一个数组。如何在 main 方法中打印数组中的数据? 的相关文章

随机推荐