使用错误输入数据创建的强类型列表

时间:2014-07-28 17:38:51

标签: java arraylist typed

我有一个强类型列表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个值。

2 个答案:

答案 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 []编译时没有警告。