簡體   English   中英

Java中未經檢查的轉換警告

[英]Unchecked cast warning in Java

Eclipse表示: Type safety: Unchecked cast from Object to ObjectArrayList<Car>

final ObjectArrayList<Car> icars = (ObjectArrayList<Car>) cars[i];

cars的定義為:

final Object[] cars = new Object[1000];
for (int i = 0; i < 1000; i++) {
    cars[i] = new ObjectArrayList<Car>();
}

Eclipse建議將@SuppressWarnings("unchecked")icars對象。 但是我讀過某個地方在Java中不贊成使用注解,所以我應該保留它原樣嗎?

警告只是,警告您,不能保證在cars數組中要強制轉換的對象是ObjectArrayList<Car>

事實證明,Java不允許使用泛型類型聲明數組,除非它們是不受限制的(請參閱Java 1.6:創建List的數組 ,或此錯誤報告6229728:允許特殊情況下的泛型數組創建 )。 但是, 如果您可以這樣聲明數組,則不會得到警告:

final ObjectArrayList<Car>[] cars=new ObjectArrayList<Car>[1000]; // not allowed

如果您確實想避免未經檢查的類型轉換,則應使用強類型集合而不是數組(例如List<ObjectArrayList<Car>> )。

@SuppressWarnings("unchecked")注釋只會告訴編譯器不要顯示警告。 除非警告確實使您煩惱,否則我不建議您使用它。 現實情況是,您將進行未經檢查的強制轉換(如果您確定數組中元素的類型,這不是問題)。

附帶說明一下,Java中不反對使用注解。 實際上,它們似乎將在Java 8中變得更加強大(似乎將支持JSR 308:Java類型注釋 )。 也許您讀到@Deprecated是注釋。

您將cars定義為: Object[] cars因此當您嘗試將cars元素放入icars時,您是從Object投射到ObjectArrayList<Car>

編譯器無法知道cars數組中的所有元素是否都是ObjectArrayList<Car> ,因此它顯示警告

為了避免這種情況,您可以將cars數組定義更改為:

 
 
 
 
  
  
  final ObjectArrayList<Car>[] cars = new ObjectArrayList<Car>[1000];
 
 
  

如果您不能將Object[] cars更改為ObjectArrayList<Car>[]數組,則可以,將其保持不變。 編譯器僅向您發出警告。 您知道可以進行強制轉換時,就不必再聽編譯器說的話了。

如果您發現警告煩人,則可以添加@SuppressWarnings("unchecked")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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