Можно ли ссылаться на вложенный класс из подкласса, как в Java? - PullRequest
4 голосов
/ 04 июня 2019

Существует библиотека Java, с которой я взаимодействую, которая имеет следующее:

class Superclass {
    static class Nested {}
}

class Subclass extends Superclass {}

Это недопустимый код в Kotlin:

class Test() {
    val thing1 = Superclass.Nested()
    val thing2 = Subclass.Nested()
}

Компилятор говорит, что Subclass.Nested это неразрешенная ссылка.Однако эквивалентный Java-код не является недопустимым:

class Test {
    Superclass.Nested thing1 = new Superclass.Nested();
    Subclass.Nested thing2 = new Subclass.Nested();
}

Есть ли в Kotlin какой-либо другой способ ссылаться на вложенный класс, квалифицируя его подклассом вместо суперкласса?

(ПочемуПоскольку в игре присутствует необычный шаблон устаревания: Superclass устарел и заменяется на Subclass. Класс Nested будет перемещен в Subclass позже. Это внешнее ограничение, с которым я работаюпод.)

Ответы [ 2 ]

3 голосов
/ 04 июня 2019

Я не уверен, что это решит вашу проблему, но вы можете получить доступ к вложенному классу из подкласса, чтобы вы могли сделать что-то вроде этого:

open class Superclass {
    class Nested
}

class Subclass : Superclass() {

    companion object Nested {
        operator fun invoke(): Superclass.Nested = Nested()
    }

}

class Test() {
    val thing1 = Superclass.Nested()
    val thing2 = Subclass.Nested()
}

Кроме того, чтобы избежать путаницы, вы можете просто создать функцию, которая создает вложенный класс

class Subclass : Superclass() {

    companion object {
        fun createNested() = Nested()
    }

}
1 голос
/ 04 июня 2019

Поскольку вы не можете получить доступ к исходному коду или ждать, пока PR будет утвержден, я, вероятно, попробую его с typealias, например:

typealias MyNested = Superclass.Nested

и используйте его следующим образом:

MyNested()

Как только Superclass устареет, вам нужно только заменить псевдоним типа, например:

typealias MyNested = Subclass.Nested

Таким образом, у вас есть только 1место, где вам нужно адаптировать свой код при удалении Superclass.

Теперь очень жаль, что оба класса не находятся под вашим контролем и что эта функция Java не работает в Kotlin.С другой стороны, я очень рад, что это не так.Что-то вроде Subclass.Nested, когда такого вложенного класса на самом деле нет, на мой взгляд, не очень удобно.Тем не менее, это также возможно с функциями расширения ... так что теперь я нахожусь в конфликте; -)

Как также сказано в комментарии: может быть шанс, что это также может быть просто ошибкой.Я пока не нашел никаких источников, было ли это осознанным дизайнерским решением или нет.Это звучит хорошо для меня, но это не значит, что это было сделано намеренно.Вы можете задать тот же вопрос на форумах Kotlin или , открыть вопрос и связать его здесь.

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