当将数据结构声明为其接口并强制转换时,Java会将细节存储在某个地方
我在不同的地方看到过这样的建议:当使用集合、列表或散列将它们声明为接口时,然后在实例化时使用所需的特定结构 例如:当将数据结构声明为其接口并强制转换时,Java会将细节存储在某个地方,java,interface,Java,Interface,我在不同的地方看到过这样的建议:当使用集合、列表或散列将它们声明为接口时,然后在实例化时使用所需的特定结构 例如: Map<K,V> map; ... map = new LinkedHashMap<K,V>(); Map; ... map=newlinkedhashmap(); 或 列表; ... 列表=新的ArrayList(); 我的问题是,Java是否在某处“存储实现细节”。 我问这个问题的原因是我在这个类中使用了HashMap。所以我将它的成员声明为一个映
Map<K,V> map;
...
map = new LinkedHashMap<K,V>();
Map;
...
map=newlinkedhashmap();
或
列表;
...
列表=新的ArrayList();
我的问题是,Java是否在某处“存储实现细节”。
我问这个问题的原因是我在这个类中使用了HashMap。所以我将它的成员声明为一个映射,在初始化它时,基于一些额外的变量,我将它初始化为一个具有一定大小的HashMap。我也有一个getter
现在在另一个类中,我可以访问该类,所以当我需要映射时,我只需调用getter并获取它。所以我将其转换为HashMap
HashMap<K,V> hashMap = (HashMap) class.getMap();
for(Map.Entry<K,V> entry : hashMap.entrySet())
...
HashMap HashMap=(HashMap)class.getMap();
for(Map.Entry:hashMap.entrySet())
...
它还记得它是什么吗。如果我认为顺序对我来说很重要,并将其更改为使用LinkedHashMap,它仍然会使用FIFO顺序进行迭代。如果每次我在项目的其他部分使用该类时都必须将其转换为特定的结构,那么在使用时声明该类不是更好吗 您不必强制转换到HashMap 这项工作:
for (Map.Entry<K,V> entry : class.getMap().entrySet ())
for(Map.Entry:class.getMap().entrySet())
我的问题是,Java是否“存储实现细节”
某处
嗯,是的,当然有。但这只是正常的OOP。具体类的类型在运行时是已知的
我必须迭代映射,但foreach不适用于映射
你怎么会这么想?是的,您可以通过集合的接口迭代集合如果您不能,整个机制将完全无用。当然,您提供的代码没有编译,因为您错误地使用了类
关键字
所以我将其转换为HashMap
HashMap<K,V> hashMap = (HashMap) class.getMap();
for(Map.Entry<K,V> entry : hashMap.entrySet())
...
不知道你的代码的细节,我仍然很确定这是错误的方法。
代码>但是FooCH对于map 不适用。这是错误的,这和C++有什么关系?是的,我纠正了它。我的问题是,如果我在构建映射时使用LInkedHashMap进行初始化,那么当我稍后获得它并进行迭代时,它会保持LInkedHashMap的顺序(先插入,先出),还是会表现为一个不一定保持order@AndreasAndreou它将根据正在使用的实现进行操作。如果您创建了LinkedHashMap,它将仍然是LinkedHashMap。@pbabcdefp感谢您的评论。我错过了。很好,我包含了另一个选项:)@AndreasAndreou:本例中的接口仅表示“元素可以迭代”。实现定义了这是如何发生的。是的,这个类只是一个不幸的用法,我想说我调用了一个类(我显然没有使用关键字class),至于这个类不起作用,我很着急。我想说的是,对于一个Map或HashMap,当您迭代时,顺序不一定保持不变(主要是在重新刷新时)@AndreasAndreou:接口本身并没有做任何事情。它不会迭代。它只指定实现可以迭代。map
对象的静态(即编译时已知)类型是map
还是HashMap
并不重要。运行时的动态类型在任何情况下都是HashMap
,它是HashMap
,它“完成所有工作”。