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>
. Вам надо сделать так, чтобы типы данных в коллекции совпадали с типом назначаемых в неё элементов.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Всем добрый день! Разрабатываю приложение для AndroidВ приложении галерея, подкачиваю картинки с сайта через библиотеку Picasso
При первой попытке запуска sqldeveloper система запрашивает полный путь установленного JDKДля того, чтобы узнать полную путь до jdk я использую команду...