Этот тип имеет конструктор и должен быть инициализирован здесь – 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
Свойство включает / исключает классы данных Kotlin Правильно ли написана документация Котлина? Как избежать выражения объекта для функций, возвращающих интерфейс SAM Что происходит, когда кнопка «Назад» нажата до завершения асинхронного вызова? Схема SwitchPreference не корректна, пока не постукивается Как получить проверенные идентификаторы в ListView через Kotlin? Почему я должен возвращать Unit.INSTANCE при реализации на Java функции Kotlin, которая возвращает Unit? Использование метода получения Anko Ошибка несоответствия AnkoContext <ViewGroup> Найдено AnkoContext <Context> Создать файл ZIP в Котлине Ссылки функций и лямбда @Parcelize аннотации toghether с наследованием Android onCheckedChangeListener поведение bizzare Как получить номер мобильного телефона с SIM-карты в Android Программно с использованием языка kotlin? Kotlin Построить на travis-CI, но тесты не запускаются Кинжал 2 с несколькими кольцами с Kotlin