Domanda

Mi è piaciuta la discussione su Differenze nei farmaci generici, e mi chiedevo se esistessero lingue che utilizzassero questa funzionalità particolarmente bene.

Non mi piace davvero Java List<? extends Foo> per un List di cose per le quali Liskov è sostituibile Foo.Perché non posso List<Foo> coprirlo?

E onestamente, Comparable<? super Bar>?

Inoltre, non riesco a ricordare per tutta la vita il motivo per cui non dovresti mai restituire un array di farmaci generici:

public T[] getAll<T>() { ... }

Non mi sono mai piaciuti i modelli in C++, ma ciò era dovuto principalmente al fatto che nessuno dei compilatori avrebbe mai potuto emettere loro un messaggio di errore anche lontanamente significativo.Una volta ho effettivamente fatto a make realclean && make 17 volte per ottenere qualcosa da compilare;Non ho mai capito perché la diciassettesima volta fosse il fascino.

Quindi, chi in realtà piace usando i generici nella loro lingua preferita?

È stato utile?

Soluzione

Haskell implementa abbastanza bene la parametrizzazione del costruttore di tipi (generici o polimorfismo parametrico).Lo stesso vale per Scala (anche se a volte ha bisogno di un po' di mano in mano).

Entrambi questi linguaggi hanno tipi di tipo superiore (a.k.a.costruttori di tipi astratti, o polimorfismo del costruttore di tipi, o polimorfismo di ordine superiore).

Vedere qui: Generici di tipo superiore

Altri suggerimenti

Penso che i generici in Java siano in realtà piuttosto buoni.La ragione per cui List<Foo> è diverso da List<? extends Foo> è quello quando Foo è un sottotipo di Bar, List<Foo> non è un sottotipo di List<Bar>.Se potessi trattare a List<Foo> oggetto come a List<Bar>, allora potresti aggiungere Bar si oppone ad esso, il che potrebbe rompere le cose.Qualsiasi sistema di tipo ragionevole lo richiederà.Java ti consente di farla franca con il trattamento Foo[] come sottotipo di Bar[], ma ciò forza i controlli di runtime, riducendo le prestazioni.Quando si restituisce un array di questo tipo, è difficile per il compilatore sapere se eseguire un controllo in fase di esecuzione.

Non ho mai avuto bisogno di utilizzare i limiti inferiori (List<? super Foo>), ma immagino che potrebbero essere utili per restituire valori generici.Vedere covarianza e controvarianza.

Nel complesso, però, sono assolutamente d'accordo con le lamentele sulla sintassi eccessivamente dettagliata e sui messaggi di errore confusi.I linguaggi con inferenza di tipo come OCaml e Haskell probabilmente ti renderanno tutto più semplice, sebbene anche i loro messaggi di errore possano creare confusione.

Cavolo, l'inglese non implementa nemmeno bene i generici.:)

La mia propensione è per C#.Principalmente perché è quello che sto usando attualmente e li ho usati con buoni risultati.

Aggiungerò OCaml all'elenco, che ha davvero generico generici.Sono d'accordo sul fatto che le classi di tipo di Haskell siano davvero ben fatte, ma è un po' diverso in quanto Haskell non ha una semantica OO, ma OCaml supporta OO.

Utilizzo .Net (VB.Net) e non ho avuto problemi con i generici.È per lo più indolore.

Dim Cars as List(Of Car)
Dim Car as Car

For Each Car in Cars
...
Next

Non ho mai avuto problemi con l'utilizzo delle raccolte generiche, anche se non sono arrivato al punto di progettare da solo oggetti che utilizzino i generici.

Penso che C# e VB.NET facciano un buon lavoro con i generici.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top