1 public static final Parcelable.Creator<SkuInfo> CREATOR = new Creator<SkuInfo>() { 2 @Override 3 public SkuInfo createFromParcel(Parcel parcel) { 4 SkuInfo sku = new SkuInfo(); 5 sku.sku = parcel.readString(); 6 sku.num = parcel.readInt(); 7 sku.price = parcel.readLong(); 8 sku.minWholesale = parcel.readInt(); 9 sku.attrsMap = parcel.readHashMap(HashMap.class.getClassLoader()); 10 return sku; 11 }
编译器会警告第9行存在unchecked assignment: HashMap to HashMap<String,String>
这个问题发生的原因是 readHashMap 方法返回的是HashMap, 而attrsmap 的类型是HashMap<String,String>. 我们没有对 readHashMap 方法的返回值的Key 和 value的类型进行检测,所以在运行的时候,可能会出现返回值是 HashMap<int,String> 这种类型的,所以编译器会报警。
解决这个问题的方法有以下两种:
1. 如果你能确保readHashMap方法返回的值是正确的,可以@Override上加一句 @SuppressWarnings("unchecked")
2. 如果不能确保,可以加上以下检查代码
public static <K, V> HashMap<K, V> castHash(HashMap input, Class<K> keyClass, Class<V> valueClass) { HashMap<K, V> output = new HashMap<K, V>(); if (input == null) return output; for (Object key: input.keySet().toArray()) { if ((key == null) || (keyClass.isAssignableFrom(key.getClass()))) { Object value = input.get(key); if ((value == null) || (valueClass.isAssignableFrom(value.getClass()))) { K k = keyClass.cast(key); V v = valueClass.cast(value); output.put(k, v); } else { throw new AssertionError( "Cannot cast to HashMap<"+ keyClass.getSimpleName() +", "+ valueClass.getSimpleName() +">" +", value "+ value +" is not a "+ valueClass.getSimpleName() ); } } else { throw new AssertionError( "Cannot cast to HashMap<"+ keyClass.getSimpleName() +", "+ valueClass.getSimpleName() +">" +", key "+ key +" is not a " + keyClass.getSimpleName() ); } } return output; }
sku.attrsMap = castHash(parcel.readHashMap(HashMap.class.getClassLoader()),String.class,String.class);