簡體   English   中英

Java:輸入安全性 - 未經檢查的強制轉換

[英]Java: Type safety - unchecked cast

這是我的代碼:

Object[] data = GeneComparison.readData(files);
MyGenome genome = (MyGenome) data[0];
LinkedList<Species> breeds = (LinkedList<Species>) data[1];

它為LinkedList提供此警告:

Type safety: Unchecked cast from Object to LinkedList<Species>

為什么它會抱怨鏈表而不是MyGenome?

當你將非參數化類型(Object)轉換為參數化類型(LinkedList)時,Java會抱怨這樣。 它告訴你它可能是任何東西。 它與第一個強制轉換沒有什么不同,除非第一個將生成ClassCastException,如果它不是那個類型但第二個不會。

這一切都歸結為類型擦除。 運行時的LinkedList實際上只是一個LinkedList。 您可以在其中放置任何內容,它不會像第一個示例那樣生成ClassCastException。

經常要擺脫這個警告你必須做的事情如下:

@SuppressWarning("unchecked")
public List<Something> getAll() {
  return getSqlMapClient.queryForList("queryname");
}

其中queryForList()返回一個List(非參數化),你知道內容將是Something類。

另一方面是Java中的數組是協變的 ,這意味着它們保留了運行時類型信息。 例如:

Integer ints[] = new Integer[10];
Object objs[] = ints;
objs[3] = "hello";

會拋出異常。 但:

List<Integer> ints = new ArrayList<Integer>(10);
List<Object> objs = (List<Object>)ints;
objs.add("hello");

是完全合法的。

因為這里:

MyGenome genome = (MyGenome) data[0];

你沒有使用泛型

和這里

LinkedList<Species> breeds = (LinkedList<Species>) data[1];

你正在使用它們。

這只是一個警告,你在數據數組中混合類型。 如果您知道自己在做什么(我的意思是,如果第二個元素包含LinkedList ),您可以忽略該警告。

但更好的方法是擁有一個這樣的對象:

class Anything {
    private Object [] data;
    public Anything( Object [] data ) {
         this.data = data;
    }
    public Gnome getGnome() {
    .....
    }
    public List<Species> getBreeds() {
    ......
    }
 }

並且必須在正確的轉換之前返回正確的方法,以便最終得到:

Anything anything = new Anything( GeneComparison.readData(files) );
MyGenome genome             = anything.getGnome(); // similar to data[0]
LinkedList<Species> breeds = anything.getBreeds(); // similar to data[1];

在這些方法中,你必須進行適當的轉換。

暫無
暫無

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

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