[英]Strongly typed List created with wrongly typed data
我有一个类型强的List Arraylist<Byte>
并且开发人员试图添加原始字节数据,但是结果完全出乎意料。 一个byte[]
已添加到此列表; 这怎么可能? 这是一个简短的示例,演示了Java 7中的问题
public static void main(String[] args) {
ArrayList<Byte> wrappedBytes;
byte[] primitiveBytes = new byte[] { (byte) 0x01, (byte) 0x02, (byte) 0x03 };
wrappedBytes = new ArrayList(Arrays.asList(primitiveBytes));
Object value1 = wrappedBytes.get(0);
System.out.println(value1.getClass().getSimpleName());
}
系统说第一个值是一个byte[]
但是列表中应该只包含Byte
值。
您创建了一个原始ArrayList
,然后将其分配给ArrayList<Byte>
。 编译此代码时,有关未检查的分配的信息应该收到警告,如果给出了Arrays.asList
的类型化返回, Arrays.asList
应该收到有关调用原始ArrayList
构造函数的警告。
因此,您最终创建了一个List<byte[]>
,并使用它创建了一个原始ArrayList
,并将其分配给ArrayList<Byte>
。 这只会创建ClassCastException
失败,因为您将get(0)
的返回值分配给了Object
。
之所以是List<byte[]>
的原因是不可能使用List<byte>
,因为不允许将原始类型用作通用类型参数,而Arrays.asList(T... a)
是通用方法。 唯一的推断是List<byte[]>
。
Arrays.asList需要对象数组(T ... obj)作为其参数。 您在这里拥有的唯一对象是byte [],因此得到List<byte[]>
。
尝试
Byte[] primitiveBytes = new Byte[]{...};
要完成,这
wrappedBytes = new ArrayList<>(Arrays.asList(primitiveBytes));
使用byte []编译时将失败,而使用Byte []编译时则没有警告。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.