Gradle не собирает проект

226
19 ноября 2017, 13:59

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>
Answer 1

У нас есть примерно такие классы:

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 );
}
Answer 2

У вас несовпадение типа данных в коллекции items, объявленной как Collection<Bundlable> и типа который вы пытаетесь в неё положить - Collection<? extends Item>. Вам надо сделать так, чтобы типы данных в коллекции совпадали с типом назначаемых в неё элементов.

READ ALSO
кнопка по центру

кнопка по центру

подскажите, пожалуйста, какой метод располагает кнопку по центру панели JFrame

217
Открыть картинку на весь экран из Галереи (Java)

Открыть картинку на весь экран из Галереи (Java)

Всем добрый день! Разрабатываю приложение для AndroidВ приложении галерея, подкачиваю картинки с сайта через библиотеку Picasso

227
Реализация кнопок awt

Реализация кнопок awt

Плохо понимаю принцип реализации кнопокБуду признателен за разъяснения

186
установка sqldeveloper на ubuntu 16.04

установка sqldeveloper на ubuntu 16.04

При первой попытке запуска sqldeveloper система запрашивает полный путь установленного JDKДля того, чтобы узнать полную путь до jdk я использую команду...

216