Котлин не идентифицирует Java зарезервированные ключевые слова

У меня проблема с использованием зарезервированных ключевых слов Java в Kotlin. Поскольку не все зарезервированные ключевые слова доступны в Kotlin, компилятор Kotlin не может (не?) Обнаружить зарезервированные ключевые слова, которые есть только в Java.

Например, возьмите пример default, Это зарезервированное ключевое слово Java. Это означает, что вы не можете сделать следующее.

public class UserJava {
    public String default;
}

Однако это не зарезервированное ключевое слово в Kotlin, поэтому вы можете использовать его следующим образом

class UserKotlin {
    var default: String? = null
}

Для тех, кто не знает Java, было бы трудно узнать, что они являются зарезервированным ключевым словом. Так как компилятор Kotlin не выдаст вам ошибки или какого-либо предупреждения о том, что вы используете зарезервированное ключевое слово, это может позже вызвать некоторые проблемы, которые вы не ожидаете.

Одна из проблем, с которой он может столкнуться, - это во время AnnotationProcessing, которые представляют собой библиотеки, которые вы включаете в ваш gradle с kapt или же annotationProcessor, Поскольку Kotlin использует компилятор Java, когда вы, например, пытаетесь получить поля UserKotlin класс, вы получите пустой список, так как компилятор Java не "понимает" поле default и игнорирует это (пропускает это?).

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

@Entity
class User{
    @PrimaryKey
    var id: Int = 0
    var default: String? = null
}

Процессор аннотации комнаты сгенерирует SQL-запрос на создание

CREATE TABLE IF NOT EXISTS `User` (`id` INTEGER NOT NULL, PRIMARY KEY(`id`))

Таким образом, он в основном пропустил default поле.

Есть ли способ, которым Kotlin выдает предупреждение, когда я пытаюсь использовать зарезервированные ключевые слова Java? Или это ошибка в Kotlin, которая еще не исправлена? Или есть какие-либо документы, которые упоминали эту проблему.

Если я знаю Java, то я могу использовать такие ключевые слова, так как знаю, что они зарезервированы в Java. Но что, если я не знаю Java и не могу понять, в чем проблема?

2 ответа

Я искренне сомневаюсь, что это проблема внутри JVM, но с библиотекой аннотаций. Котлин не разоблачает default переменная; То, что является публичным / открытым, это геттер и сеттер. Тем не менее, возможно, библиотека аннотаций пытается получить доступ к закрытому полю напрямую и в итоге не находит его, потому что это зарезервированное ключевое слово, и компилятор kotlin, возможно, дал ему другое имя. Разве библиотека не дает никаких предупреждений во время выполнения?

Тем не менее, kotlin планирует распространяться по javascript/native, и поскольку jvm становится просто частью его империи, я не думаю, что у них есть какие-либо планы по добавлению предложенных вами предупреждений. Я предполагаю, что библиотекам придется адаптироваться к этому или со временем потерять адептов.

В Android Lint уже есть необязательное правило "без жестких ключевых слов Kotlin", которое предупреждает об использовании ключевых слов Kotlin в коде Java в качестве идентификаторов, а руководство по взаимодействию также предупреждает о том, чтобы не использовать эти ключевые слова в коде Java.

Скорее всего, то же самое может быть легко реализовано с другой стороны, как проверка в самом плагине Kotlin, в идеале отключенная по умолчанию, поскольку большинству людей она не понадобится, но в некоторых случаях она все же будет полезна. Я еще не нашел проблему для этого на YouTrack, но я думаю, что было бы разумно открыть ее.

Другие вопросы по тегам