Gradle в Android Studio не собирает проект, ругается на ошибку в коде, где стоит аннотация Suppress Warnings. Что делать?
Код:
public LinkedList<Item> items;
@SuppressWarnings("unchecked")
public void restoreFromBundle( Bundle bundle ) {
pos = bundle.getInt( POS );
type = Type.valueOf( bundle.getString( TYPE ) );
items = new LinkedList<>((Collection<? extends Item>) bundle.getCollection(ITEMS));
}
Ошибка:
Error:(373, 81) error: incompatible types: Collection<Bundlable>
cannot be converted to Collection<? extends Item>
У нас есть примерно такие классы:
interface Bundlable {}
class Item implements Bundlable {}
class Bundle {
public Collection<Bundlable> getCollection( String key ) {
return null; //something...
}
}
Обобщенные типы в java инвариантны, т.е. Collection<Item> не является наследником Collection<Bundlable>, несмотря на то, что Item реализует Bundlable. Поэтому javac, который используется Android Studio, не дает выполнить приведение
new LinkedList<>( (Collection<? extends Item>)bundle.getCollection( "items" ) );
т.к. с его точки зрения Collection<? extends Item> никак не может наследовать Collection<Bundlable>.
Оригинальный код писался, видимо, в Eclipse, который так делать позволяет.
Что с этим делать? Если можно править код Bundle, то лучше заменить возвращаемый тип:
public Collection<? extends Bundlable> getCollection( String key )
Форма <? extends Bundlable> означает ковариантность, т.е. наследниками будут все коллекции классов, расширяющих Bundlable, включая Collection<Item>. Останется предупреждение про "unchecked cast", поскольку у нас java, type erasure и во время выполнения нельзя проверить, что возвращается действительно коллекция Item.
Если править Bundle нельзя, то можно сделать приведение к Object, чтобы компилятор от вас отвязался:
(Collection<? extends Item>)(Object)bundle.getCollection( "items" )
или перекидать объекты вручную, как это в некоторых местах делается:
List<Item> items = new LinkedList<Item>();
for ( Bundlable b : bundle.getCollection( "items" ) ) ) {
items.add( (Item)b );
}
У вас несовпадение типа данных в коллекции items, объявленной как Collection<Bundlable> и типа который вы пытаетесь в неё положить - Collection<? extends Item>. Вам надо сделать так, чтобы типы данных в коллекции совпадали с типом назначаемых в неё элементов.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей