Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中扩展一个列表来存储额外的元数据,并强制它只接受一种类型的对象?_Java_List_Collections_Extending - Fatal编程技术网

如何在java中扩展一个列表来存储额外的元数据,并强制它只接受一种类型的对象?

如何在java中扩展一个列表来存储额外的元数据,并强制它只接受一种类型的对象?,java,list,collections,extending,Java,List,Collections,Extending,除了包含的项目外,我还必须将列表的名称和id存储在其内部。因此,我扩展了ArrayList,如下所示: class MyList<E> extends ArrayList<E>{ private int id; private String name; MyList(int id, String name){ this.id = id; this.name = name; } id getId(){

除了包含的项目外,我还必须将列表的名称和id存储在其内部。因此,我扩展了
ArrayList
,如下所示:

class MyList<E> extends ArrayList<E>{
    private int id;
    private String name;

    MyList(int id, String name){
        this.id = id;
        this.name = name;
    }
    id getId(){       return id;   }
    String getName(){ return name; }
}
…并且它应该只自动接受
MyObject
s

(除了meta之外,创建一个包含
ArrayList
的包装器会更好吗?但是因为它仍然是一个列表,为什么要删除所有列表的典型功能…

class MyList extends ArrayList<MyObject>
class MyList扩展了ArrayList
当您像这样为类声明声明类型参数时

class MyList<MyObject> ...
类MyList。。。
类型
MyObject>
不是您的类型,它是一个类型变量,其名称也为
MyObject

您需要的是使用
MyObject
类型作为
ArrayList
类型参数的类型参数,如上所示


但是,正如其他人所建议的,合成可能是一种更好的方法,即你在问题中建议的包装

class MyList extends ArrayList<MyObject>
class MyList扩展了ArrayList
当您像这样为类声明声明类型参数时

class MyList<MyObject> ...
类MyList。。。
类型
MyObject>
不是您的类型,它是一个类型变量,其名称也为
MyObject

您需要的是使用
MyObject
类型作为
ArrayList
类型参数的类型参数,如上所示



但是,正如其他人所建议的,组合可能是一种更好的方法,即你在问题中建议的包装器。

正如已经回答的那样,正确的声明是

class MyList extends ArrayList<MyObject>
为此:

  • 您可以轻松地切换
    链接列表
    或任何其他列表的
    阵列列表
  • 您可以控制该类提供的方法
  • 如果您喜欢链接样式,可以将那些
    void
    更改为
    MyList
  • 等等

正如已经回答的那样,正确的声明是

class MyList extends ArrayList<MyObject>
为此:

  • 您可以轻松地切换
    链接列表
    或任何其他列表的
    阵列列表
  • 您可以控制该类提供的方法
  • 如果您喜欢链接样式,可以将那些
    void
    更改为
    MyList
  • 等等

我认为在这种情况下,应该使用组合而不是继承。创建类并将
ArrayList
作为其类变量之一。我认为在这种情况下,应该使用组合而不是继承。创建类并将
ArrayList
作为其类变量之一。感谢您提供此示例。需要了解的一个问题是:为什么不实现
List
接口?它仍然是一个列表,当我想要遍历它时,等等。这仍然是可能的。还是我错了?@nico411这个类肯定可以实现
List
,但它没有,只是为了表明您不必这样做,它是可选的。你有权决定什么对你更方便。例如,如果您想要实现链接(例如
list.add(e1).add(e2).add(e3)
),您将无法实现
list
。至于迭代,您只需实现
Iterable
。我已经更新了我的答案来说明这一点。谢谢你的例子。需要了解的一个问题是:为什么不实现
List
接口?它仍然是一个列表,当我想要遍历它时,等等。这仍然是可能的。还是我错了?@nico411这个类肯定可以实现
List
,但它没有,只是为了表明您不必这样做,它是可选的。你有权决定什么对你更方便。例如,如果您想要实现链接(例如
list.add(e1).add(e2).add(e3)
),您将无法实现
list
。至于迭代,您只需实现
Iterable
。我更新了我的答案来说明这一点。