linearlayout example custom android constructor kotlin kotlin-android-extensions

linearlayout - custom view kotlin android example



Este tipo tiene un constructor y se debe inicializar aquĆ­-Kotlin (2)

No necesitas

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

porque esto es equivalente Y si la clase tiene un constructor primario, el tipo base puede (y debe) inicializarse allí mismo, usando los parámetros del constructor primario.

class SomeApp : Application() { }

que también es equivalente en java a

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

Acabo de empezar a experimentar la aplicación de Android utilizando Kotlin . Solo quería heredar la clase de Application esta manera:

class SomeApp : Application { }

Pero el compilador levanta la advertencia:

y la sugerencia lo cambia a:

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

Leí sobre constructores primarios y secundarios en los documentos . Entonces, si la súper clase tiene un constructor primario, ¿es necesario escribir aquí? Como clase de aplicación tiene su propio constructor

public Application() { super(null); }

¿Entonces sería necesario tener un constructor primario para los derivados? o ¿No puedo hacer algo como Java?

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

o este error sugiere algo mas? ¿Alguien me puede explicar en detalle? Soy muy nuevo en el lenguaje y esto me parece raro.

Edición: en java, puedo hacer lo siguiente: la class SomeApp extends Application{ }

Tiene un constructor implícito, por lo que no tengo que escribir: la class SomeApp extends Application{ public Application(){ super(); } } class SomeApp extends Application{ public Application(){ super(); } } Pero en kotlin tengo que definir un constructor vacío como el siguiente: class SomeApp:Application(){ } ?


No se trata de constructores primarios / secundarios.

En JVM (y casi en cualquier otro lugar) se llama a un constructor de la clase base Application cuando creas una instancia de SomeApp

En Java la sintaxis es como dijiste:

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

Aquí debe declarar un constructor , y luego debe llamar a un constructor de la superclase.

En Kotlin el concepto es exactamente el mismo, pero la sintaxis es mejor:

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

Aquí declara un constructor SomeApp() sin parámetros, y dice que llama a Application() , sin parámetros en ese caso. Aquí Application() tiene exactamente el mismo efecto que super() en el fragmento de código java.

Y en algunos casos se pueden omitir algunos paréntesis:

class SomeApp : Application()

El texto del error dice: This type has a constructor, and thus must be initialized here . Eso significa que el tipo Application es una clase, no una interfaz. Las interfaces no tienen constructores, por lo que la sintaxis para ellos no incluye una invocación del constructor (paréntesis): class A : CharSequence {...} . Pero Application es una clase, por lo que invoca a un constructor (cualquiera, si hay varios), o "inicialícelo aquí".