2016-03-10 22 views
11

OK, ora che Kotlin è ufficialmente uscito e sto iniziando a giocarci di nuovo, sono abbastanza confuso che devo scegliere tra i vantaggi di sealed e data ma in qualche modo non posso averli entrambi.Kotlin: la classe sigillata non può "contenere" classi di dati? Perché?

Questo, per esempio, sembra avere un senso per me, ma non può essere compilato:

sealed class Expr { 
    data class Const(val number: Double) : Expr() 
    data class Sum(val expr1 : Expr, val expr2 : Expr) : Expr() 
} 

perché le classi di dati non possono estendersi altre classi.

C'è qualcosa che mi manca?

+0

Dal momento che Kotlin 1.1 è ora possibile https://kotlinlang.org/docs/reference/whatsnew11.html?q=da&p=0#sealed-and-data-classes. – Stim

risposta

15

Poco prima di entrare nello stato Beta, il team di Kotlin aveva deciso di aggiungere alcune limitazioni sull'uso delle classi data (see this post) a causa dei problemi causati nelle gerarchie di classi.

Una delle limitazioni è che la classe data non deve sottotipare un'altra classe, sono consentite solo le interfacce. Di conseguenza, le classi data non possono derivare da un sealed class.

Questa era una misura necessaria per evitare un ulteriore rinvio della versione 1.0. Alcune delle limitazioni sono state sollevate nelle versioni future, una volta che i casi problematici sono stati esaminati attentamente e che è stata trovata una buona soluzione di progettazione.

+1

Grazie per il link! – Lovis

+0

Quindi, forse c'è speranza - grazie per la spiegazione! –

+1

Se sto leggendo bene, sembra che questa restrizione verrà revocata con 1.1 (vedi [questo problema] (https://github.com/Kotlin/KEEP/issues/31) e [questo documento di progettazione] (https://github.com/Kotlin/KEEP/blob/master/proposals/data-class-inheritance.md)). – mkobit