Поведение реализации интерфейса Kotlin при использовании интерфейса Java - PullRequest
2 голосов
/ 22 января 2020

Если у меня есть интерфейс в Kotlin:

interface KotlinInterface {
    val id: String
}

, я могу реализовать его так:

class MyClass : KotlinInterface {
    override val id: String = "id"
}

Однако, если бы я использовал интерфейс Java например:

public interface JavaInterface {
    String id = "id";
}

Я не могу переопределить переменную класса id аналогичным образом:

class MyClass : JavaInterface {
    override val myId: String = JavaInterface.id //linter says: 'myId' overrides nothing
}

Я также не могу использовать id в другом месте, несмотря на то, что он имеет предопределенный значение:

class MyClass : JavaInterface {
    val myArray: Array<String> = arrayOf(id) // linter would say that id is not defined rather than recognising it as the string “id”
}

Похоже, я должен использовать это так:

class MyClass {
    val id: String = JavaInterface.id
    val myArray: Array<String> = arrayOf(id)
}

Может ли кто-нибудь объяснить эту разницу в поведении и указать на то, что я могу неправильно понять?

Ответы [ 3 ]

2 голосов
/ 22 января 2020

В интерфейсе java каждая переменная является конечной переменной stati c, и переменные stati c не могут быть переопределены. Вот почему вы видите это предупреждение.

Редактировать 1:

Kotlin interface

  interface Ser {
       var name: String //abstract
    }

эквивалентно java interface

public interface Ser {
   @NotNull
   String getName();

   void setName(@NotNull String var1);
}
1 голос
/ 22 января 2020

Я не могу переопределить переменную класса id аналогичным образом:

Вы также не можете сделать это в Java; эквивалент будет

class MyClass implements JavaInterface {
    @Override String getMyId() {
        return JavaInterface.id;
    }
}

getMyId ничего не переопределяет.

И если вы напишите в Java

class MyClass implements JavaInterface {
    String id = JavaInterface.id;
}

, вы не переопределите что угодно, потому что вы не можете переопределить поля (кроме того, MyClass.id является неконечным частным полем пакета экземпляра, в то время как JavaInterface.id неявно является окончательным полем stati c publi c, потому что интерфейсы не позволяют любой другой вид).

Я также не могу использовать id в другом месте, несмотря на то, что он имеет предопределенное значение:

Опять же, как в Java; вам нужно JavaInterface.id в Java и Kotlin или import some.package.JavaInterface.id, чтобы использовать только id (import static в Java).

Там - это разница, если MyClass реализует JavaInterface, потому что тогда в Java вы можете ссылаться на JavaInterface.id как MyClass.id или someInstanceOfMyClass.id; и внутри MyClass так же, как id. Но это часто считается ошибкой, поэтому дизайнеры Kotlin избежали этого.

0 голосов
/ 22 января 2020

Вы объявили константу (publi c stati c String id = "id") в интерфейсе Java.

В то время как Kotlin интерфейс объявил абстрактное свойство. См Kotlin ссылка: https://kotlinlang.org/docs/reference/interfaces.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...