Considera questo codice "legacy":
public interface IPersistentCollection {
IPersistentCollection cons(Object o);
}
Generato in Java, potrebbe diventare qualcosa del genere:
public interface IPersistentCollection<T> {
IPersistentCollection<T> cons(T o);
}
L'aggiunta di un nuovo elemento a una raccolta Java mutevole non dovrebbe cambiare il tipo della raccolta esistente. Ma a differenza delle collezioni Java, cons () restituisce una collezione completamente nuova e immutabile, lasciando invariata la vecchia raccolta, aprendo la possibilità che potrebbe assumere un tipo diverso rispetto alla collezione originale.
-
Ovviamente, dovresti essere in grado di avere un oggetto di tipo Ford in una collezione di Cars e ottenere una collezione di Cars indietro (covarianza). Penso che questo sia coperto dal precedente esempio generico.
-
Se Auto e Treno estendessero entrambe una classe di veicoli, sarebbe utile poter trasportare un treno per una collezione di auto e ottenere indietro una collezione di veicoli (controvarianza). Come lo scriverei anche io? Ho pensato dichiarando nuove variabili di tipo limitate, S ed E per "Veicolo" e "Treno" in questo esempio:
// Illegal because of <S super T> <S super T, E extends S> IPersistentCollection<S> cons(E o); // Simpler, but still Illegal because java disallows <S super T> <S super T> IPersistentCollection<S> cons(S o);
-
Se vogliamo assumere che il programmatore sappia cosa stanno facendo, dovresti avere a disposizione qualcosa di totalmente estraneo a una collezione e recuperare una collezione di oggetti. Penso che questo sia il caso estremo di contravarianza, ma non sono sicuro che ci sia persino un nome per questo ("Dynamic Language" forse?).
Penso che se il # 2 fosse legale, coprirebbe i casi n. 1 e n. 3.
Le mie domande sono:
A. In che misura è possibile fare # 2 in Java?
B. Il n. 2 è possibile / più semplice in altre lingue? Scala? Haskell? ML?
C. In teoria, un sistema di tipi che preferiva la versione più specifica di S nell'esempio 2 poteva gestire una definizione come questa. Che libro posso leggere sui sistemi di tipi senza un dottorato in matematica? "Tipi e linguaggi di programmazione" di Pierce è il posto migliore in cui iniziare?
Il codice di esempio sarebbe apprezzato. Se sto usando termini come covarianza e controvarianza in modo errato, gradirei essere educatamente corretto.