2015-12-13 10 views
10

Ho appena iniziato a sperimentare l'app per Android utilizzando Kotlin. Volevo solo per ereditare Application classe come questa:Questo tipo ha un costruttore e deve essere inizializzato qui - Kotlin

class SomeApp : Application { 

} 

Ma il compilatore genera l'allarme:

enter image description here

e suggestione modifiche a:

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

ho letto su primary and secondary constructors in the docs . Quindi se la super classe ha un costruttore principale, allora è necessario scrivere qui? come la classe Application ha il suo costruttore

public Application() { 
    super(null); 
} 

quindi sarebbe necessario avere il costruttore principale per derivato? o non posso fare qualcosa come Java modo:

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

o questo errore suggerisce qualcos'altro? Qualcuno può spiegarmi in dettaglio? Sono molto nuovo nella lingua e questo mi sembra strano.

Edit: In Java posso effettuare le seguenti operazioni: class SomeApp extends Application{ }

E 'costruttore implicita, in modo da non dover scrivere: class SomeApp extends Application{ public Application(){ super(); } } Ma in Kotlin devo definire costruttore vuoto come la seguente: class SomeApp:Application(){ } ?

risposta

22

Non si tratta di costruttori primari/secondari.

On JVM (e praticamente qualsiasi altro luogo) un costruttore della classe base Application viene chiamato quando si crea un'istanza di SomeApp

In Java la sintassi è come lei ha detto:

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

Qui Si deve dichiarare un constructor e quindi è deve chiamare un costruttore della classe super.

Nel Kotlin il concetto è esattamente lo stesso, ma la sintassi è più bello:

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

Qui si dichiara un costruttore SomeApp() senza parametri, e dire che si chiama Application(), senza parametri in questo caso. Qui lo Application() ha esattamente lo stesso effetto di super() nello snippet java.

E in alcuni casi alcune parentesi possono essere omesse:

class SomeApp : Application() 

Il testo dell'errore dice: This type has a constructor, and thus must be initialized here. Ciò significa che il tipo Application è una classe, non un'interfaccia. Le interfacce non hanno costruttori, quindi la loro sintassi non include una chiamata di costruttore (parentesi): class A : CharSequence {...}. Ma Application è una classe, quindi invochi un costruttore (se ce ne sono diversi) o "inizializza qui".

+0

qualche spiegazione su questo errore? –

+0

Cosa intendi? Questo è tutto quello che c'è da fare – voddan

+0

@ KrupalShah Ho modificato la risposta. E 'quello che stavi chiedendo? – voddan

2

Non è necessario

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

perché questo è equivalente. E se la classe ha un costruttore principale, il tipo base può (e deve) essere inizializzato proprio lì, usando i parametri del costruttore principale.

class SomeApp : Application() { 
} 

che equivale anche in java

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

Ehi, sto parlando di Kotlin. Di cosa stai parlando? –

+0

Penso che stai ricevendo il suo "override" onCreate' "confuso con la dichiarazione di un costruttore –

+1

Quindi non ho idea di cosa stia chiedendo. Il motivo dell'auto-completamento è l'aggiunta di "override onCreate" perché ha visto che ha avuto un errore nel suo costruttore e ha deciso di aggiungere con entusiasmo un override di onCreate. – denixtry

Problemi correlati