Kotlin apply () расширение lint сообщение в Android Studio 3.0-alpha8

Привет, дорогой друг Stackoverflow! У меня есть следующий код, который вызывает следующую ошибку. линт

fun newInstance(message: String?): DialogFragment { return DialogFragment().apply { arguments = Bundle().apply { putString("arg", message) } } } 

В сообщении указывается, что this ссылка внутри функции apply() указывает на класс BaseBundle , доступный с API 21, который будет сбой при более низком API. Bundle # putString (ключ, значение) определенно доступен в более низких версиях, но в Android Studio 3.0-alpha8 есть ошибка.

Проблема довольно странная, поскольку я могу видеть декомпилированный код следующим образом: декомпилированы

Какой ссылочный тип Bundle не является BaseBundle .

Почему у нас есть ошибка Lint на первом месте?

Одним из способов является использование let вместо apply , например:

 fun newInstance(message: String?): DialogFragment { return DialogFragment().apply { arguments = Bundle().let { it.putString("arg", message) it } } } 

Это действительно похоже на ошибку. Это известная ошибка, но на самом деле можно понять, почему вы получаете предупреждение, глядя на исходный код Bundle.java.

До api 21 Bundle имел метод ( проверьте здесь )

 public void putString(@Nullable String key, @Nullable String value) 

и сам класс не имел суперкласса. Из api 21 Bundle расширяет недавно добавленный класс BaseBundle и этот метод putString был перемещен в BaseBundle . Итак, когда вы вызываете метод на api 21 и выше, метод принадлежит BaseBundle , для более низкой версии он принадлежит Bundle .

Это как-то связано с блоком приложения, потому что предупреждение не появляется, если вы вызываете метод в переменной типа Bundle напрямую.