Котлин не идентифицирует Java зарезервированные ключевые слова - PullRequest
0 голосов
/ 10 января 2019

У меня проблема с использованием зарезервированных ключевых слов 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 и игнорирует его (пропускает?).

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

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

Процессор аннотаций комнат сгенерирует запрос на создание SQLite

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 10 января 2019

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

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

0 голосов
/ 10 января 2019

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

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

...