Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

This type has a constructor and must be initialized here - Kotlin

I just get started experimenting Android app using Kotlin. I just wanted to inherit Application class like this:

class SomeApp : Application {  } 

But the compiler raises the warning:

enter image description here

and suggestion changes it to:

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

I read about primary and secondary constructors in the docs. So if super class has a primary constructor, then is it necessary to write here? like Application class has its own constructor

public Application() {     super(null); } 

then it would be necessary to have primary constructor for derived? or Can't I do something like Java way:

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

or this error suggests something else? Can anyone explain me in detail? I'm very new to the language and this looks weird to me.

Edit: In java I can do the following: class SomeApp extends Application{ }

It has implicit constructor, so I do not have to write: class SomeApp extends Application{ public Application(){ super(); } } But in kotlin do I have to define empty constructor like the following: class SomeApp:Application(){ } ?

like image 680
Krupal Shah Avatar asked Dec 13 '15 06:12

Krupal Shah


People also ask

What is initialization in Kotlin?

Using Class ConstructorThe standard way to initialize an object in Kotlin is with the class constructor. It can accept a set of parameters to initialize its fields, or it can be parameterless. Kotlin has a concise syntax for declaring properties and initializing them: 1.

What type of constructor is available in Kotlin?

In Kotlin, there are two constructors: Primary constructor - concise way to initialize a class. Secondary constructor - allows you to put additional initialization logic.

Does Kotlin have constructor?

Constructors. A class in Kotlin can have a primary constructor and one or more secondary constructors. The primary constructor is a part of the class header, and it goes after the class name and optional type parameters. The primary constructor cannot contain any code.


2 Answers

This is not about primary/secondary constructors.

On JVM (and pretty much anywhere else) a constructor of the base class Application is called when you create an instance of SomeApp

In Java the syntax is like you said:

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

Here you must declare a constructor, and then you must call a constructor of the super class.

In Kotlin the concept is exactly the same, but the syntax is nicer:

class SomeApp() : Application() {     ... } 

Here you declare a constructor SomeApp() without parameters, and say that it calls Application(), without parameters in that case. Here Application() has exact the same effect as super() in the java snippet.

And in some cases some brackets may be omitted:

class SomeApp : Application() 

The text of the error says: This type has a constructor, and thus must be initialized here. That means that type Application is a class, not an interface. Interfaces don't have constructors, so the syntax for them does not include a constructor invocation (brackets): class A : CharSequence {...}. But Application is a class, so you invoke a constructor (any, if there are several), or "initialize it here".

like image 53
voddan Avatar answered Sep 23 '22 04:09

voddan


You don't need

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

because this is equivalent. And if the class has a primary constructor, the base type can (and must) be initialized right there, using the parameters of the primary constructor.

class SomeApp : Application() { } 

which is also equivalent in java to

class SomeApp extends Application {      public SomeApp(){        super();      } } 
like image 41
denixtry Avatar answered Sep 25 '22 04:09

denixtry