Подтвердить что ты не робот

Этот тип имеет конструктор и должен быть инициализирован здесь - Kotlin

Я просто начал экспериментировать с 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(); } } Но в kotlin мне нужно определить пустой конструктор, как показано ниже: class SomeApp:Application(){ }

4b9b3361

Ответ 1

Это не о первичных/вторичных конструкторах.

В JVM (и почти где-либо еще) конструктор базового класса Application вызывается при создании экземпляра SomeApp

В Java синтаксис подобен сказанному:

class SomeApp : Application {
    constructor SomeApp(){
      super();
    }
}

Здесь вы должны объявить constructor, а затем должен вызвать конструктор суперкласса.

В Kotlin понятие точно одинаково, но синтаксис более приятный:

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 - это класс, поэтому вы вызываете конструктор (любой, если его несколько), или "инициализируйте его здесь".

Ответ 2

Вам не нужно

class SomeApp : Application() {
   constructor SomeApp(){
      super();
    }
}

потому что это эквивалентно. И если класс имеет первичный конструктор, базовый тип может (и должен) быть инициализирован прямо там, используя параметры основного конструктора.

class SomeApp : Application() {
}

который также эквивалентен в java для

class SomeApp extends Application {
     public SomeApp(){
       super();
     }
}