我正在尝试实现一个扩展 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 循环。
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>
使用它。我们说我们的类扩展了 ArrayList<T>
,其中 T 是我们类的用户选择的任何内容。您的类现在将扩展
ArrayList
,而 ArrayList
又会实现 Iterable<T>
。如果您希望您的类型的表达式可在 for (SomeType variableName : collection) {}
中的“集合”位置使用,则必须实现 Iterable。您的代码片段不会(它不会扩展任何内容 - 只有它的 T 会扩展,这对您自己的类型没有影响) - 通过此修复,它会扩展。