Java从Hashtable取Integer值报incompatible types错误如何解决
Java从Hashtable中正确获取整数值的实现方案
报错根因
你遇到的Object cannot be converted to Integer类型转换报错,本质是Hashtable的get()方法返回了Object类型而非预期的Integer,通常是因为代码中Hashtable没有正确声明泛型参数,使用了无泛型约束的原始类型(Raw Type)导致的。
正确实现方案
方案一:使用泛型约束(推荐)
- 首先确保导入JDK官方的
java.util.Hashtable类,避免导入第三方同名类 - 声明
Hashtable时完整指定键、值的泛型类型,不要用无泛型的原始写法
示例代码:
import java.util.Hashtable; public class HashTableDemo { public static void main(String[] args) { // 明确指定键、值都是Integer类型 Hashtable<Integer, Integer> groupsPostId = new Hashtable<>(); groupsPostId.put(1, 100); // 泛型会自动约束返回值为Integer,无需强转 Integer postId = groupsPostId.get(1); System.out.println(postId); // 输出结果:100 } }
方案二:兼容原始类型场景
如果是维护历史代码无法修改Hashtable的泛型声明,可以手动做类型校验和强转,避免类型转换异常:
import java.util.Hashtable; public class HashTableDemo { public static void main(String[] args) { // 原始类型无泛型约束的写法 Hashtable groupsPostId = new Hashtable(); groupsPostId.put(1, 100); Object value = groupsPostId.get(1); Integer postId = null; // 先做类型校验再强转,避免运行时异常 if (value instanceof Integer) { postId = (Integer) value; } } }
额外注意事项
- JDK1.7及以上版本支持泛型菱形语法
<>,实例化时无需重复写泛型参数,代码更简洁 - 日常开发更推荐用
HashMap代替Hashtable:Hashtable是老旧的线程安全实现,所有方法都加了synchronized锁性能较低;无线程安全需求的场景用HashMap效率更高,有线程安全需求可以用ConcurrentHashMap替代。
内容的提问来源于stack exchange,提问作者andtompoi
相关产品推荐
相关产品推荐

