2012-09-05 10 views
22

Provenendo da Java Land ho cercato di insegnarmi Scala. Recentemente stavo giocando con il tipo di dati Int e ho deciso di cercare l'API per la classe Int here.cercando di capire "l'ultima classe astratta Int privato estende AnyVal in Scala

Cosa perplesso me era la definizione di classe per Int, che è abstract final.

sono scuse se non ho letto sul significato di abstract e final in Scala prima di porre questa domanda, ma io ero curioso, così ho digitato subito questo post.

Quindi quello che sto cercando di capire è: La semantica per abstract, final e extends diversa in Scala? Ancora una volta, per quanto mi risulta, in Java non è possibile avere abstract e final allo stesso tempo. Quindi come interpreto final abstract class Int private extends AnyVal?

+1

No, non lo sono, almeno in sostanza (ancora non è possibile creare un'istanza astratta, non è possibile ereditare/ignorare finale). AFAIK, il motivo per cui questo è stato fatto in questo modo è che qualche tempo fa Int e altri tipi di AnyVal erano solo degli stub, riscritti poi dal compilatore in fase di compilazione. Non lo sono dal [questo impegno] (https://github.com/scala/scala/commit/4253124eecba6bed38f1dc961c5c4ee39a29f730) –

+0

Oh, questa è un'informazione utile. Grazie per avermelo segnalato – ilango

risposta

28

Come om-nom-nom ha sottolineato nel commento, abstract vieta instanziazione (new Int), mentre final vieta la creazione di sottoclassi (new Int { ... }).

La ragione di ciò è che scala.Int è rappresentato direttamente dal tipo intero primitivo della macchina virtuale Java; gli altri tipi simili sono Byte, Short, Char, Long, Float, Double, Boolean. Poiché sono tipi primitivi sul runtime (che presentano prestazioni migliori rispetto ai cosiddetti tipi di box) e la JVM non consente di aggiungere nuove primitive, non ci sarebbe alcun modo legale per estendere tali tipi. Inoltre non c'è modo di istanziarli se non dando un letterale (val i: Int = 33).

Scala ha questi tipi per creare un sistema di oggetti unificato in cui non vi è alcuna differenza logica tra i tipi primitivi e gli 'oggetti'. Esiste tuttavia una distinzione gerarchica nella parte superiore che è AnyRef (corrispondente a java.lang.Object) e AnyVal (corrispondente a quei tipi primitivi e che aggiunge il nuovo tipo di Scala Unit).

Maggiori informazioni sul sistema di tipo unificato è data dalla Tour of Scala: Unified Types

+0

Molto apprezzato. – ilango

+0

Devo notare che esiste anche [SIP accettato] (http://docs.scala-lang.org/sips/pending/value-classes.html) che scatenerà l'uso di primitive non in scatola con comportamento non predefinito. –

+1

P.S. E sebbene tutte le primitive JVM siano rappresentate da sottotipi di 'AnyVal', l'inverso non è vero (' Unit' è già stato menzionato). In Scala 2.10, è possibile estendere 'AnyVal', creando le cosiddette [Value-Classes] (http://docs.scala-lang.org/sips/pending/value-classes.html) che sono pensate per implementazione di nuove classi numeriche, che beneficiano delle ottimizzazioni del compilatore (ad esempio l'inlining). –

Problemi correlati