Vorrei scrivere un alias di tipo per abbreviare, codice Scala bello e incapsulato. Supponiamo di avere qualche collezione che abbia la proprietà di essere una lista di mappe, il cui valore è tuple. Il mio tipo scriverebbe qualcosa come List[Map[Int, (String, String)]]
, o qualcosa di più generico come la mia applicazione lo consente. Potrei immaginare di avere un supertipo che chiede un Seq[MapLike[Int, Any]]
o qualsiasi cosa galleggi la mia barca, con sottoclassi concrete che sono più specifiche.Alias di tipo Scala incluso oggetto companion [principiante]
Vorrei quindi scrivere un alias per questo tipo lungo.
class ConcreteClass {
type DataType = List[Map[Int, (String, String)]]
...
}
Vorrei poi felicemente utilizzare ConcreteClass#DataType
ovunque posso prendere uno, e usarlo.
Ora supponiamo che io aggiungo una funzione
def foo(a : DataType) { ... }
E voglio chiamarlo da fuori con una lista vuota. Posso chiamare foo(List())
, ma quando voglio cambiare il mio tipo sottostante per essere un altro tipo di Seq
, dovrò tornare e modificare anche questo codice. Inoltre, non è molto esplicito questa lista vuota è intesa come DataType
. E l'oggetto companion non ha i metodi associati List
, quindi non posso chiamare DataType()
o DataType.empty
. Sarà ancora più fastidioso quando avrò bisogno di liste non vuote poiché dovrò scrivere una parte significativa di questo lungo tipo.
C'è un modo in cui posso chiedere a Scala di capire il mio tipo come la stessa cosa, incluso l'oggetto companion con i suoi metodi di creazione, nell'interesse di accorciare il codice e metterlo in blackbox? Oppure, qualsiasi motivo per cui non dovrei fare questo in primo luogo?
Se non intendi sottoclassi di 'ConcreteClass' per sovrascrivere' DataType', potresti essere meglio mettere entrambi gli alias 'type' e' val' nell'oggetto companion (invece di averne uno nella classe). Ecco come funzionano gli alias nell'oggetto del pacchetto 'scala'. –
Hai davvero ragione. Lo farò d'ora in poi. Grazie. – Jean
Tranne d è il tipo Lista [Nothing] – sourcedelica