Este tipo tiene un constructor y debe ser inicializado aquí – Kotlin

Empecé a experimentar con la aplicación de Android con Kotlin . Solo quería henetworkingar la class de aplicación así:

class SomeApp : Application { } 

Pero el comstackdor plantea la advertencia:

enter image description here

y la sugerencia lo cambia a:

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

Leí acerca de constructores primarios y secundarios en los documentos . Entonces, si la superclass tiene un constructor primario, ¿es necesario escribir aquí? al igual que la class de aplicación tiene su propio constructor

 public Application() { super(null); } 

entonces, ¿sería necesario tener un constructor primario para el derivado? o no puedo hacer algo como Java way:

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

o este error sugiere algo más? ¿Alguien puede explicarme en detalle? Soy muy nuevo en el lenguaje y esto me parece extraño.

Editar: En java puedo hacer lo siguiente: class SomeApp extends Application{ }

Tiene un constructor implícito, así que no tengo que escribir: 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(){ } ?

Esto no se trata de constructores primarios / secundarios.

En JVM (y prácticamente en cualquier otro lugar) se llama a un constructor de la Application de la class base cuando se crea una instancia de SomeApp

En Java, la syntax es como dijiste:

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

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

En Kotlin, el concepto es exactamente el mismo, pero la syntax es más agradable:

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

Aquí declara un constructor SomeApp() sin parameters, y dice que llama a Application() , sin parameters en ese caso. Aquí Application() tiene exactamente el mismo efecto que super() en el fragment java.

Y en algunos casos, algunos corchetes pueden omitirse:

 class SomeApp : Application() 

El text del error dice: This type has a constructor, and thus must be initialized here . Eso significa que el tipo Application es una class, no una interfaz. Las interfaces no tienen constructores, por lo que la syntax para ellos no incluye la invocación del constructor (corchetes): class A : CharSequence {...} . Pero Application es una class, por lo que invocará un constructor (cualquiera, si hay varios), o "lo inicializará aquí".

No necesitas

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

porque esto es equivalente. Y si la class tiene un constructor primario, el tipo base puede (y debe) ser inicializado allí mismo, usando los parameters del constructor primario.

 class SomeApp : Application() { } 

que también es equivalente en java a

 class SomeApp extends Application { public SomeApp(){ super(); } } 
  • Kotlin RC NoClassDefFoundError
  • Estudio de Android 3: Tiempo de ejecución de Kotlin desactualizado
  • Cómo inicializar widgets en Android usando kotlin
  • Deshabilitar la generación META-INF / * en el proyecto gradle android library kotlin
  • Cómo lanzar Cadena en Int y Largo?
  • Referencia no resuelta: kotlinx - Kotlin 1-0-0-rc-1036
  • La variable de vista de Kotlin es inesperadamente nula en el método Activity onCreate
  • La propiedad en la interfaz no puede tener un campo de respaldo
  • Quiero agregar mi versión de kotlin al proyecto Gradel
  • Error de configuration automática del complemento kotlin-gradle
  • Hacer clic en una vista de text para cambiar el fragment