簡體   English   中英

使用錯誤類型的數據創建的強類型列表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM