如何在java中扩展一个列表来存储额外的元数据,并强制它只接受一种类型的对象?
除了包含的项目外,我还必须将列表的名称和id存储在其内部。因此,我扩展了如何在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(){
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
。我更新了我的答案来说明这一点。