java hashtype_java - 使用Java HashMap多个Type - 堆栈内存溢出

你可以很好地存储元素的类型,将你期望的类型传递给get()方法并检查那里。 AFAIK没有内置的方法来存储不同类型的类型安全而没有一些常见的超类或接口。

基本上你这样做:

private static final Map lookup = new HashMap<>();

private static final Map> types= new HashMap<>();

public static T get(CacheHelper key, Class expectedType ) {

Class> type = types.get(key.getId());

if( type == null || expectedType == null || expectedType.isAssignableFrom( type ) ) {

throw new IllegalArgumentException("wrong type");

}

return (T)lookup.get(key.getId());

}

//if null values should be allowed, you'd need to change the signature to use generics

//and pass the expected type as well, e.g. void store(CacheHelper key, T value, Class type)

public static void store(CacheHelper key, Object value ) {

lookup.put(key.getId(), value);

types.put( key.getId(), value.getClass() );

}

请注意,由于您基本上禁用了缓存中的泛型,因此仍然无法捕获任何编译时错误。 如果没有常见的超类/接口或缓存本身的泛型类型,那么就没有编译时间来捕获这些错误 - 至少不容易。

如果你只是不想自己进行强制转换,你可以将它们隐藏在get()并使用可能的类强制转换异常。 在这种情况下,您可以让编译器从调用中推断出T的类型(通过赋值,显式设置或参数类型)。

但是,传递期望的类很容易提供额外的信息,您可以使用它们来创建更好的错误消息等,这些消息是您从ClassCastException获得的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值