2014-10-17 4 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

+0

Поскольку вы не знаете, какой тип 'Parcelable' распространяется, и вы скорее предполагаете, что он расширяет' T', вы должны убедиться, что каждый 'Parcelable' расширяет' T', чтобы стереть предупреждение. – Smutje

+0

Какая ошибка компиляции вы получаете? – vikingsteve

ответ

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

+1

Да, он мог бы, но он мог бы делать что-то еще, внутри которого скрыто от нас? – SMA

+1

Да, он накладывает тип 'Parcelable' на' T', чтобы продолжить использование коллекции типа safe. – Smutje

 Смежные вопросы

  • Нет связанных вопросов^_^