Этот блок правильно компилируется:
ArrayList<Baz> list = savedInstanceState.getParcelableArrayList("foo");
bar(list);
Но эти ошибки блока, в которых указано, что ArrayList<Parcelable>
нельзя отнести к ArrayList<Baz>
:
bar((ArrayList<Baz>)savedInstanceState.getParcelableArrayList("foo"))
Где бар имеет вид:
private void bar(ArrayList<Baz> food) {
}
И Baz
- это класс, реализующий интерфейс Parcelable
Есть ли способ, которым может быть сделан прямой прилив, вместо того, чтобы выполнять неявное литье и создавать ненужную переменную?
Какова ошибка, которую вы получаете; Я бы подумал, что вы получите предупреждение только о том, что это неконтролируемый актерский состав. Если это так, вам нужно добавить @SuppressWarnings("unchecked")
в функцию, из которой вы находитесь. Если честно; вам лучше всего создать отдельную переменную, чтобы поймать возвращаемое значение, а затем отправить переменную.
Одна из проблем, которые вы увидите здесь, - это то, что стирание типа Java может навредить вам. Если T объявляется по-разному между вызывающей функцией и функцией приема, когда T удаляется, нет ничего, что помешало бы кому-либо фактически отправить вашу функцию, которая ожидает, что ArrayList будет ArrayList. Вот почему это проблема безопасности типов.
У меня такая же проблема, и мое решение - создать метод для преобразования Parcelable в Baz. Например..
private ArrayList<Baz> convertParcelableToBaz(ArrayList<Parcelable> parcelableList){
ArrayList<Baz> bazList= new ArrayList<Baz>();
for (int i = 0 ; i < parcelableList.size(); i++){
bazList.add((Baz)parcelableList.get(i));
}
return bazList;
}
так что
ArrayList<Baz> list = convertParcelableToBaz(savedInstanceState.getParcelableArrayList("foo"));
и предупреждение о непроверенной броске.
Чтобы использовать ссылку метода bar(ArrayList<T> food)
, вы должны выполнить вызов общего типа, который заменяет T
на какое-то конкретное значение. T
должен быть ограничен некоторым типом else, ввести подстановочные знаки, такие как bar(ArrayList<?> food)
.
Оба этих блока одинаковы. Возьмите это как пример, который компилирует:
import java.util.ArrayList;
public class Test<T> {
public void test(){
ArrayList<T> list = (ArrayList<T>)foo();
bar(list);
bar((ArrayList<T>)foo());
}
private ArrayList<Integer> foo(){ return null; }
private void bar(ArrayList<T> food) {}
}