在将数据结构声明为其接口然后进行转换时,Java会将详细信息存储在某处

时间:2015-03-05 17:13:04

标签: java interface

我在各种地方看到过推荐使用Collection或Lists或Hashes将它们声明为接口,然后在实例化时使用你想要的特定结构。

例如:

Map<K,V> map;
...
map = new LinkedHashMap<K,V>();

List<K> list;
...
list = new ArrayList<K>();

我的问题是,Java&#34;存储实现细节&#34;某处。 我问的原因是我有这个类,我在使用HashMap。所以我将其成员声明为Map,在初始化时,基于一些额外的变量,我将其初始化为具有一定大小的HashMap。我也有一个吸气剂。

现在在另一个班级我可以访问该课程,所以当我需要地图时,我只需要调用getter并获取它。所以我把它投射到HashMap。

HashMap<K,V> hashMap = (HashMap) class.getMap();
for(Map.Entry<K,V> entry : hashMap.entrySet())
...

所以它还记得它是什么。如果我认为该订单对我很重要并将其更改为使用LinkedHashMap,它仍然会按FIFO顺序进行迭代。如果我每次在项目的其他部分使用该类时都必须将其转换为一个证书结构,那么在使用它时声明它是不是更好。

2 个答案:

答案 0 :(得分:3)

您不必强制转换为HashMap。

这有效:

for (Map.Entry<K,V> entry : class.getMap().entrySet ())

答案 1 :(得分:1)

  

我的问题是,Java“存储实现细节”吗?   某处。

嗯,是的,当然可以。但这只是正常的OOP。具体类的类型在运行时是已知的。

  

我必须迭代地图,但foreach不适用于Map。

是什么让你这么认为?是的,您可以通过其界面迭代集合。 如果不能,整个机制将毫无用处。当然,由于您错误地使用了class关键字,您提供的代码无法编译...

  

所以我把它投射到HashMap。

在不知道代码细节的情况下,我仍然非常确定这是解决问题的错误方法。