2015-12-13 5 views
10

Я только начал экспериментировать с Android-приложением, используя Kotlin. Я просто хотел, чтобы наследовать Application класс вроде этого:Этот тип имеет конструктор и должен быть инициализирован здесь - Kotlin

class SomeApp : Application { 

} 

Но компилятор поднимает предупреждение:

enter image description here

и внушение изменяет его:

class SomeApp : Application() { 
    override fun onCreate() { 
     super.onCreate() 
    } 
} 

Я читал о primary and secondary constructors in the docs , Итак, если у суперкласса есть первичный конструктор, то нужно ли здесь писать? как класс приложения имеет свой собственный конструктор

public Application() { 
    super(null); 
} 

тогда необходимо было бы иметь первичный конструктор для производного? или Я не могу сделать что-то вроде Java-способа:

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

или эта ошибка предполагает что-то еще? Может ли кто-нибудь объяснить мне подробно? Я очень новичок в этом языке, и это выглядит странно для меня.

Edit: В Java я могу сделать следующее: class SomeApp extends Application{ }

Это неявный конструктор, так что я не должен писать: class SomeApp extends Application{ public Application(){ super(); } } Но в Котлин я должен определить пустой конструктор, как следующее: class SomeApp:Application(){ } ?

ответ

22

Речь идет не о первичных/вторичных конструкторов.

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

+0

любое объяснение этой ошибки? –

+0

Что вы имеете в виду? Это все, что нужно для этого – voddan

+0

@KrupalShah Я отредактировал ответ. Это то, о чем вы спрашивали? – voddan

2

Вам не нужно

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

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

class SomeApp : Application() { 
} 

который также эквивалент в Java, чтобы

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

Эй, я говорю о Котлине. О чем вы говорите? –

+0

Я думаю, что вы получаете его «переопределяющее' onCreate' ', запутанное с объявлением конструктора –

+1

Тогда я понятия не имею, что он спрашивает. Причина, по которой автозаполнение добавляется в 'override onCreate', заключается в том, что он видел ошибку в своем конструкторе и решил с избытком добавить в переопределение onCreate. – denixtry

Смежные вопросы