为什么在尝试使用泛型实现自定义 ArrayList 时会出现此错误?

问题描述 投票:0回答:1

我正在尝试实现一个扩展 ArrayList 的子类。这个类应该打印数组的元素。

导入java.util.ArrayList;

public class MyArrayList <T extends ArrayList> {
    public void  display (MyArrayList<T> processList) {
        for (T element : processList) {

        }
    }
}

但是这段代码给了我错误: foreach 不适用于类型“MyArrayList”

我不知道为什么?

我尝试将参数类型设置为通配符,但这并没有解决问题。 编辑:这个类正在扩展 ArrayList 并显示完整的类(尽管由于某种原因,“public class MyArrayList ”似乎没有正确显示。该错误特定于“processList”的 for 循环。

java generics arraylist
1个回答
0
投票
public class MyArrayList <T extends ArrayList> {

这并不意味着你的类扩展了 arraylist。

这意味着你的类说:对于这种类型的每个类型引用(例如,当你声明一个接受

MyArrayList
的方法时,或者你创建一个
MyArrayList
类型的变量时 - 任何时候你提到 'MyArrayList',类型),有一个类型参数。它的意思是 - 无论你想要它意味着什么(通常对于列表来说,人们会认为它意味着:“我要持有的东西的类型” - 这就是
java.util.ArrayList
的意思 -
ArrayList<String>
是一个数组列表,保存字符串对象)。

具体来说,我们将调用该类型,无论它是什么,“T”,并且我们还将限制它:它必须是

ArrayList
或其某些子类型。具体来说,原始数组列表类型(你真的不想要那个)。

换句话说,每当有人使用这个类时,他们选择的 T 必须扩展 ArrayList。

类型变量本身不执行任何操作。您刚刚声明,对您的类型的任何使用都意味着用户选择某种类型 T。好的。如果你什么也不做,那就没有任何意义。

想必您正在寻找的是这样的:

public class MyArrayList<T> extends ArrayList<T> {}

这说:

  • 任何时候
    MyArrayList
    用作类型,用户必须选择某种类型,我们将其称为“T”;每个用户都会选择自己的 T,所以我们不知道 T 是什么 - 我们为所有用户编写代码,所以,T 一次性代表所有内容。这是一种元类型。
  • 我们延长
    ArrayList
    。嘿 - 我们正在使用 ArrayList 作为一种类型,而 ArrayList 要求我们选择一个类型!
  • 我们选择“T”。我们的 T. 请注意,语法是相同的(两种情况下都是
    <T>
    ),但它们代表不同的东西。第一个
    <T>
    声明类型变量。第二个
    <T>
    使用它。我们说我们的类扩展了
    ArrayList<T>
    ,其中 T 是我们类的用户选择的任何内容。

您的类现在将扩展

ArrayList
,而
ArrayList
又会实现
Iterable<T>
。如果您希望您的类型的表达式可在
for (SomeType variableName : collection) {}
中的“集合”位置使用,则必须实现 Iterable。您的代码片段不会(它不会扩展任何内容 - 只有它的 T 会扩展,这对您自己的类型没有影响) - 通过此修复,它会扩展。

© www.soinside.com 2019 - 2024. All rights reserved.