2010-07-21 14 views
6

Nel mio codice e in numerose pubblicazioni di mailing list, ho notato confusione dovuta al fatto che Nulla viene inferito come limite minimo superiore di altri due tipi.In quali condizioni si deduce Nulla di desiderabile?

La risposta può essere evidente a voi *, ma io sono pigro, quindi vi sto chiedendo *:

  • A quali condizioni è inferire Nulla in questo modo il risultato più desiderabile?

  • Sarebbe logico che il compilatore abbia generato un errore in questi casi o un avviso a meno che non venga sovrascritto da qualche tipo di annotazione?

* plurale

risposta

2

È impossibile dedurre Nothing come il limite superiore minimo di due tipi, a meno che questi due tipi siano entrambi Nothing. Quando si deduce il limite superiore minimo di due tipi e questi due tipi non hanno nulla in comune, si otterrà Any (nella maggior parte dei casi, si otterrà AnyRef, perché si otterrà solo Any quando un tipo di valore come Int o Long è coinvolto.)

+0

Una risposta corretta alla mia domanda poco chiara, abbastanza buona per ora. :) –

4

Niente è il sottotipo di tutto, quindi è in un certo senso la contro parte di qualsiasi, che è il super-tipo di tutto. Nulla non può essere istanziato, non potrai mai tenere un oggetto Nothing. Ci sono due situazioni (io sappia) in cui nulla è effettivamente utile:

  • Una funzione che non restituisce mai (a differenza di una funzione che non restituisce alcun utile valore, che utilizzerebbe Unità invece), che succede per loop infiniti, blocco infinito, lancio sempre di un'eccezione o uscita dall'applicazione
  • Come modo per specificare il tipo di contenitori vuoti, ad es. Nullo o Nessuno. In Java, non è possibile avere un singolo oggetto Nil per un elenco immutabile generico senza casting o altri trucchi: se si desidera creare un elenco di date, anche l'elemento vuoto deve avere il tipo giusto, che deve essere un sottotipo di Data. Come data e ad es. I numeri interi non condividono un sottotipo comune in Java, non è possibile creare una tale istanza Nil senza trucchi, nonostante il fatto che il tuo Nil non contenga alcun valore. Ora Scala ha questo sottotipo comune per tutti gli oggetti, quindi puoi definire Nil come object Nil extends List[Nothing], e puoi usarlo per avviare qualsiasi Lista che ti piace.

Alla tua seconda domanda: Sì, sarebbe utile. Immagino che ci sia già un interruttore del compilatore per attivare questi avvisi, ma non ne sono sicuro.

+0

Grazie, ma sono ben consapevole di ciò a cui nulla va bene, in isolamento; Sto cercando di capire quando è utile per essere dedotto dall'algoritmo LUB. –