代码之家  ›  专栏  ›  技术社区  ›  fadedExplorer

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

  •  -1
  • fadedExplorer  · 技术社区  · 2 年前

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

    导入java.util.ArrayList;

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

    然而,这段代码给了我一个错误: foreach不适用于类型“MyArrayList”

    我不知道为什么?

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

    1 回复  |  直到 2 年前
        1
  •  2
  •   rzwitserloot    2 年前
    public class MyArrayList <T extends ArrayList> {
    

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

    这意味着您的类会说:对于此类型的每个类型引用(例如,当您声明一个接受 MyArrayList ,或者您生成类型为的变量 MyArrayList -每当你提到“MyArrayList”,类型)时,都会有一个类型参数。这意味着——无论你想它意味着什么(通常对于列表,人们会认为它的意思是:“我应该持有的东西的类型”——这就是它的含义 java.util.ArrayList -一个 ArrayList<String> 是一个包含字符串对象的数组列表)。

    具体来说,我们将把这种类型称为“T”,无论它是什么,我们也将限制它:它必须是 ArrayList 或者它的某个子类型。特别是原始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> 。如果希望类型的表达式在中的“collection”位置可用,则必须实现Iterable for (SomeType variableName : collection) {} .你的代码片段没有(它没有扩展任何内容,只有它的t扩展了,这对你自己的类型没有影响)-通过这个修复,它确实扩展了。