Плагин Android Gradle v3.3.0 - > не могу найти R $ raw при использовании proguard

В разрешении перегрузки используются 3 фазы ( JLS 15.2.2 ):

  1. Первая фаза (§15.12.2.2) выполняет разрешение перегрузки без разрешения преобразования бокса или распаковки или использования вызова метода переменной arity. Если на этом этапе не обнаружен какой-либо применимый метод, обработка продолжается до второй фазы.
  2. Вторая фаза (§15.12.2.3) выполняет разрешение перегрузки при разрешении бокса и распаковки, но все же исключает использование вызова метода переменной arity. Если на этом этапе не обнаружен какой-либо применимый метод, обработка продолжается до третьей фазы.
  3. Третья фаза (§15.12.2.4) позволяет комбинировать перегрузку с методами переменной arity, боксом и распаковкой.
blockquote>

В вашем примере оба метода являются методами переменной arity, поэтому применяется третья фаза.

Теперь, поскольку у нас есть два метода на выбор, мы ищем более конкретный метод.

JLS 15.12.2.5. Выбор наиболее конкретного метода говорит:

Если более чем один метод-член доступен и применим к вызову метода, необходимо выбрать один для предоставления дескриптора для запуска отправка времени. Язык программирования Java использует правило, в котором выбран наиболее специфический метод.

...

Один применимый метод m1 более конкретный, чем другой применимый метод m2, для вызова с аргументом выражения e1, ..., ek, если выполнено одно из следующих утверждений:

...

m2 не является общим, m1 и m2 применимы при вызове переменной arity и где первые k переменных параметров arity параметров m1 являются S1, ..., Sk и первыми k переменными параметрами параметра arity m2 являются T1, ..., Tk, тип Si более специфичен, чем Ti для аргумента ei для всех i (1 ≤ i ≤ k). Кроме того, если m2 имеет k + 1 параметров, то k + 1'th переменный параметр параметра arity m1 является подтипом k + 1-го параметра параметра переменной arity m2.

blockquote>

В вашем случае у вас есть два не общих метода, которые применимы при вызове переменной arity (т.е. оба имеют varargs). Чтобы один из методов был выбран, когда вы вызываете method(1), один из них должен быть более конкретным, чем другой. В вашем случае каждый метод имеет только один параметр и для одного из них должен быть более конкретным, чем для другого, тип этого одного параметра должен быть подтипом параметра другого метода.

Поскольку int не является подтипом Integer, а Integer не является подтипом int, ни один из ваших методов не является более конкретным, чем другой. Следовательно, ошибка The method method(int[]) is ambiguous for the type Test.

Пример, который будет работать:

public static void method(Object... x) {
    System.out.println("varargs");
}

public static void method(Integer... x) {
    System.out.println("single");
}

Поскольку Integer является подтипом Object, будет выбран второй метод когда вы вызываете method(1).

2
задан Entreco 16 January 2019 в 13:56
поделиться

1 ответ

В чем разница между assembleRelease и :app:assembleRelease

Первый запускает задачу assembleRelease на всех модулях относительно текущего уровня. Последний запускает его только на модуле app (и его зависимостях).

Почему переключение на плагин Android Gradle 3.3.0 влияет на то, какую задачу мне нужно вызвать для сборки моего apk? Мы используем assembleRelease повсюду в наших конвейерах CI для построения наших apks.

Вопрос не имеет достаточной информации, чтобы сказать наверняка, но в примечаниях к выпуску есть ряд изменений, перечисленных в . Например, эта проблема может быть связана с:

Более быстрое создание класса R для библиотечных проектов: Ранее плагин Android Gradle генерировал файл R.java для каждого из ваших зависимости проекта, а затем скомпилировать эти R-классы вместе с другими классами вашего приложения. Теперь плагин генерирует JAR-файл, содержащий скомпилированный R-класс вашего приложения напрямую, без предварительной сборки промежуточных R.java классов. Эта оптимизация может значительно повысить производительность сборки для проектов, которые включают множество подпроектов и зависимостей библиотеки, и повысить скорость индексации в Android Studio.

0
ответ дан laalto 16 January 2019 в 13:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: