Котлин не идентифицирует 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, но я думаю, что было бы разумно открыть ее.