gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:44:34 24 4
gpt4 key购买 nike

我似乎无法理解我应该如何在 main 方法中使用 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]);

编辑

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

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

...但是您尝试将其作为 T 的数组返回在 returnItems() :

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

当你尝试运行你的代码时,你会得到一个异常:

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

这是由于一个叫做 type erasure 的东西造成的.基本上,Java 编译器将用普通类(在本例中为 Object)替换所有泛型类型,并插入强制转换以保持类型安全。

所以这行来自您的 main()方法:

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

会看到 animalsGeneric<String> ,然后变成这样:

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

但是您返回的数组创建为 new Object[] , 不是 new String[] ,并且您不能向下转换,除非该对象实际上是子类型,因此是异常。

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

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

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

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

关于java - 从泛型类返回一个数组。如何在 main 方法中打印数组中的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27987782/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com