2014-10-17 71 views
-1

我有以下代碼如何從我的方法中刪除'unchecked'警告?

private static class ParcelableParser<T> { 
    private ArrayList<T> parse(List<Parcelable> parcelables) { 
     ArrayList<T> parsedData = new ArrayList<T>(); 
     for(Parcelable parcelable : parcelables) {    
      parsedData.add((T) parcelable); 
     } 
     return parsedData; 
    } 
} 

它被稱爲如下

ParcelableParser<SomeClass> cellParser = new ParcelableParser<SomeClass>(); 
cellParser.parse(bundle.getParcelableArrayList("some String")); 

它在警告Type safety: Unchecked cast from Parcelable to T

不管我做什麼,我總是有一些討厭的編譯錯誤。 我已閱讀關於PECS規則,但我無法在此處應用它。

樣品溶液(不編譯)

private static class ParcelableParser<T extends Parcelable> { 
    private ArrayList<T> parse(List<T> parcelables) { 
     ArrayList<T> parsedData = new ArrayList<T>(); 
     for(T parcelable : parcelables) {    
      parsedData.add((T) parcelable); 
     } 
     return parsedData; 
    } 
} 

使用它作爲

return new ParcelableParser<SomeClass>() 

.parse(bundle.getParcelableArrayList( 「SomeString」));

prodces

The method parse(List<SomeClass>) in the type MyClass.ParcelableParser<SomeClass> is not applicable for the arguments (ArrayList<Parcelable>)

+0

「T」的界限是什麼? – PeterK 2014-10-17 12:09:22

+0

由於您不知道哪種類型的Parcelable擴展,您寧願假設它擴展了'T',您必須確保每個Parcelable擴展'T'來清除警告。 – Smutje 2014-10-17 12:09:25

+0

你收到了什麼編譯錯誤? – vikingsteve 2014-10-17 12:10:05

回答

1

正如你所知道parcelable是T型你爲什麼不使用t的。試試這個:

public static class ParcelableParser<T> { 
    private ArrayList<T> parse(List<T> parcelables) { 
     ArrayList<T> parsedData = new ArrayList<T>(); 
     for(T parcelable : parcelables) {    
      parsedData.add(parcelable); 
     } 
     return parsedData; 
    } 
} 
+1

LOL,一種將'parcelables'的所有元素分配給'parsedData'的較便宜的方法是'return parcelables'。 – Smutje 2014-10-17 12:13:19

+1

是的,他可以,但他可能會做一些我們隱藏的其他東西? – SMA 2014-10-17 12:14:43

+1

是的,他將'Parcelable'類型轉換爲'T'來繼續使用類型安全集合。 – Smutje 2014-10-17 12:15:36