我有一个强类型列表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
个值。
答案 0 :(得分:2)
您创建了原始ArrayList
,然后将其分配给ArrayList<Byte>
。在编译有关未经检查的分配的代码时,您应该收到一条警告,并且在给定ArrayList
的类型返回时,有关于调用原始Arrays.asList
构造函数的警告。
因此,您最终会创建List<byte[]>
,使用它创建原始ArrayList
,然后将其分配给ArrayList<Byte>
。由于您已将ClassCastException
的回复分配给get(0)
,因此无法创建Object
。
它List<byte[]>
的原因是List<byte>
是不可能的,因为基本类型不允许作为通用类型参数,Arrays.asList(T... a)
是一种通用方法。唯一的推论是List<byte[]>
。
答案 1 :(得分:1)
Arrays.asList期望一个对象数组(T ... obj)作为其参数。你在这里唯一的对象是byte [],因此得到List<byte[]>
。
尝试
Byte[] primitiveBytes = new Byte[]{...};
完成,这个
wrappedBytes = new ArrayList<>(Arrays.asList(primitiveBytes));
使用byte []编译时会失败,并且在使用Byte []编译时没有警告。