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