热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

迭代java中的泛型hashmap-Iteratingoveragenerichashmapinjava

IhavethishashmapinmyabstractclassDrawn,andmyintentistofillitwitheveryinstanceofe

I have this hashmap in my abstract class Drawn, and my intent is to fill it with every instance of every class that extends Drawn. I initialize the map like so:

我在我的抽象类中绘制了这个hashmap,我的意图是用每个延伸绘制的类的每个实例填充它。我像这样初始化地图:

public static HashMap drawns = new HashMap();

I attempt to add elements to the hash table like so:

我试图像这样添加元素到哈希表:

//this code is in the abstract class Drawn()
public void init(){
    idCount++;
    setID(idCount);
    drawns.put(idCount,this); 

  }

And then I attempt to iterate like so:

然后我尝试迭代这样:

for( E : Drawn.drawns.values()) {
  E.draw();
}

Both the iterator and the init() code have compile time errors. However, if I change the type parameters to Drawn instead of I can get everything to compile, but then when I add instances of a subclass to the hash table, they are not detected by the iterator.

迭代器和init()代码都有编译时错误。但是,如果我将类型参数更改为Drawing而不是我可以编译所有内容,但是当我将子类的实例添加到哈希表时,迭代器不会检测到它们。

1 个解决方案

#1


5  

For the "putting" part in init - the problem is that you're saying it's a map of some type of value where that type extends Drawn, but you're not saying what it is. That means you can't legitimately put any entries in. You really will need to change it to a Map - and that should be absolutely fine with subclasses, and the iteration code below will still be fine.

对于init中的“put”部分 - 问题是你说它是某种类型值的映射,其中该类型扩展为Drawn,但你不是说它是什么。这意味着你不能合法地输入任何条目。你真的需要将它改为Map - 这对于子类应该是绝对正确的,下面的迭代代码仍然可以。

The reason you can't do what you want is that the type system is trying to prevent this sort of problem:

你不能做你想做的事情的原因是类型系统试图阻止这种问题:

Map stringMap = new HashMap();
Map objectMap = stringMap; // This is fine
objectMap.put(10, new Object()); // This *mustn't* be valid...
String value = stringMap.get(10); // Or this would be dangerous

When you fetch a value from the map, you'll only know that it's a Drawn reference - if you want to use any subclass-specific methods, you'll need to cast to the right type. That's unavoidable if you want to have a map that can have multiple different kinds of value.

当你从地图中获取一个值时,你只会知道它是一个绘制引用 - 如果你想使用任何子类特定的方法,你需要转换为正确的类型。如果你想拥有一个可以有多种不同价值的地图,这是不可避免的。

When you're iterating just over values then you can just use:

当您只是迭代值时,您可以使用:

for (Drawn drawn : Drawn.drawns.values()) {
    drawn.draw();
}

Or if you need the key as well:

或者如果您还需要密钥:

// Or Map.Entry after the earlier change
for (Map.Entry entry : Drawn.drawns.entrySet()) {
    // Use entry.getKey() and entry.getValue() here
}

推荐阅读
  • Java集合详解5:深入理解LinkedHashMap和LRU缓存
    Java集合详解5:深入理解LinkedHashMap和LRU缓存今天我们来深入探索一下LinkedHashMap的底层原理,并且使用linkedhashmap来实现LRU缓存。具体代码在我的 ... [详细]
  • HashTable与ConcurrentHashMap均可实现HashMap的功能,对外提供了键值对存储的数据结构。但是在内部结构及实现上有何区别,性能上的差异到底在哪里又是如何导致的 ... [详细]
  • Java之HashMap在多线程情况下导致死循环的问题
    PS:不得不说Java编程思想这本书是真心强大..学习内容:1.HashMap<K,V>在多线程的情况下出现的死循环现象当初学Java的时候只是知道HashMap< ... [详细]
  • 转载自:http:www.blogjava.netCarpenterLeearchive20160427430268.html总体介绍之所以把HashSet和HashMa ... [详细]
  • 缓存这个东西就是为了提高运行速度的,由于缓存是在寸土寸金的内存里面,不是在硬盘里面,所以容量是很有限的。LRU这个算法就是把最近一次使用时间离现在时间最远的数据删除掉。先说说List:每 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 本文介绍了游标的使用方法,并以一个水果供应商数据库为例进行了说明。首先创建了一个名为fruits的表,包含了水果的id、供应商id、名称和价格等字段。然后使用游标查询了水果的名称和价格,并将结果输出。最后对游标进行了关闭操作。通过本文可以了解到游标在数据库操作中的应用。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 本文介绍了一个适用于PHP应用快速接入TRX和TRC20数字资产的开发包,该开发包支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的轻量级部署场景。提供的功能包括生成地址、验证地址、查询余额、交易转账、查询最新区块和查询交易信息等。详细信息可参考tron-php的Github地址:https://github.com/Fenguoz/tron-php。 ... [详细]
  • HashMap的相关问题及其底层数据结构和操作流程
    本文介绍了关于HashMap的相关问题,包括其底层数据结构、JDK1.7和JDK1.8的差异、红黑树的使用、扩容和树化的条件、退化为链表的情况、索引的计算方法、hashcode和hash()方法的作用、数组容量的选择、Put方法的流程以及并发问题下的操作。文章还提到了扩容死链和数据错乱的问题,并探讨了key的设计要求。对于对Java面试中的HashMap问题感兴趣的读者,本文将为您提供一些有用的技术和经验。 ... [详细]
  • HashMap的扩容知识详解
    本文详细介绍了HashMap的扩容知识,包括扩容的概述、扩容条件以及1.7版本中的扩容方法。通过学习本文,读者可以全面了解HashMap的扩容机制,提升对HashMap的理解和应用能力。 ... [详细]
  • 本文介绍了在实现了System.Collections.Generic.IDictionary接口的泛型字典类中如何使用foreach循环来枚举字典中的键值对。同时还讨论了非泛型字典类和泛型字典类在foreach循环中使用的不同类型,以及使用KeyValuePair类型在foreach循环中枚举泛型字典类的优势。阅读本文可以帮助您更好地理解泛型字典类的使用和性能优化。 ... [详细]
  • 工作经验谈之-让百度地图API调用数据库内容 及详解
    这段时间,所在项目中要用到的一个模块,就是让数据库中的内容在百度地图上展现出来,如经纬度。主要实现以下几点功能:1.读取数据库中的经纬度值在百度上标注出来。2.点击标注弹出对应信息。3 ... [详细]
  • Iamworkingonaprojectwhichrequiresopentokandcallkitfornotifyingusers.However,theappli ... [详细]
  • HashMap:键值对(key-value):通过对象来对对象进行索引,用来索引的对象叫做key,其对应的对象叫做value.默认是1:1关系:存在则覆盖,当key已经存在,则利用新的va ... [详细]
author-avatar
U友50141126
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有