Я только начал экспериментировать с Android-приложением, используя Kotlin . Я просто хотел наследовать класс Application следующим образом:
class SomeApp : Application { }
Но компилятор поднимает предупреждение:
и предложение меняет его на:
class SomeApp : Application() { override fun onCreate() { super.onCreate() } }
Я читал о первичных и вторичных конструкторах в документах . Итак, если у суперкласса есть первичный конструктор, то нужно ли здесь писать? класс Application имеет свой собственный конструктор
public Application() { super(null); }
то необходимо было бы иметь первичный конструктор для производного? или Я не могу сделать что-то вроде Java-способа:
class SomeApp : Application { constructor SomeApp(){ super(); } }
или эта ошибка подсказывает что-то еще? Может ли кто-нибудь объяснить мне подробно? Я очень новичок в этом языке, и это выглядит странно для меня.
Изменить: В java я могу сделать следующее: class SomeApp extends Application{ }
Он имеет неявный конструктор, поэтому мне не нужно писать: class SomeApp extends Application{ public Application(){ super(); } }
class SomeApp extends Application{ public Application(){ super(); } }
Но в kotlin мне нужно определить пустой конструктор, как class SomeApp:Application(){ }
ниже: class SomeApp:Application(){ }
?
Речь идет не о первичных / вторичных конструкторах.
В JVM (и почти в любом другом месте) конструктор базового класса Application
вызывается при создании экземпляра SomeApp
В Java синтаксис подобен тому, как вы сказали:
class SomeApp : Application { constructor SomeApp(){ super(); } }
Здесь вы должны объявить constructor
, а затем вы должны вызвать конструктор суперкласса.
В Котлине концепция совершенно такая же, но синтаксис более приятный:
class SomeApp() : Application() { ... }
Здесь вы объявляете конструктор SomeApp()
без параметров и говорите, что он вызывает Application()
, без параметров в этом случае. Здесь Application()
имеет тот же эффект, что и super()
в фрагменте java.
И в некоторых случаях некоторые скобки могут быть опущены:
class SomeApp : Application()
Текст ошибки говорит: This type has a constructor, and thus must be initialized here
. Это означает, что тип Application
– это класс, а не интерфейс. Интерфейсы не имеют конструкторов, поэтому синтаксис для них не включает вызов конструктора (скобки): class A : CharSequence {...}
. Но Application
– это класс, поэтому вы вызываете конструктор (любой, если его несколько), или «инициализируйте его здесь».
Вам не нужно
class SomeApp : Application() { constructor SomeApp(){ super(); } }
потому что это эквивалентно. И если класс имеет первичный конструктор, базовый тип может (и должен) быть инициализирован прямо там, используя параметры основного конструктора.
class SomeApp : Application() { }
который также эквивалентен в java для
class SomeApp extends Application { public SomeApp(){ super(); } }