Этот тип имеет конструктор и должен быть инициализирован здесь – 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(); } } 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(); } } 
Intereting Posts
Android Koltin передает значения spinner в изменяемый список Проверить ожидаемые исключения в Котлине Исключение UninferredParameterTypeConstructor во время сборки, когда общие параметры не указаны явно Плагин 'org.jetbrains.kotlin' не удалось инициализировать и будет отключен. Перезапустите Android Studio Как добавить поддержку градиента для проекта TestNG Kotlin? Android проверяет, соответствует ли текстовый ввод (время) формату Предполагаемый тип – Фрагмент! но ожидалось PlaceAutocompleteFragment Изменение высоты списка элементов при установке элемента изображения не может генерировать привязки вида java.lang.IndexOutOfBoundsException Котлин коанс не работает? Я сошел с ума? FirebaseRecyclerAdapter – populateViewHolder не получает доступ к данным Весенняя ботинок Kotlin Jersey ModelValidationException Класс SpringBoot + Jackson + Kotlin: игнорируются аннотации полей Runnable не работает в плавающей панели действий на Android JAX-RS с Kotlin MessageBodyWriter не найден