Vedi anche:
Una digressione. Sentiti libero di saltare.
Per i programmatori che hanno familiarità con C #, esiste una funzionalità simile:
I termini, covarianza e controvarianza, possono essere ricondotti alle prime discussioni provenienti dal principio di sostituzione di Liskov (LSP) .
L'obiettivo di progettazione del carattere jolly con limite inferiore (LBWC) è quello di garantire la sicurezza del tipo della seguente parte di codice.
(Questo è solo un esempio, uno degli esempi molto semplici tra gli altri.)
List<? super RationalNumber> containerOne = new ArrayList<RationalNumber>();
List<? super RationalNumber> containerTwo = new ArrayList<Number>();
List<? super RationalNumber> containerThree = new ArrayList<Object>();
RationalNumber itemValue = new RationalNumber(22, 7);
containerOne.add(itemValue);
containerTwo.add(itemValue);
containerThree.add(itemValue);
In breve, LBWC consente al "handle" - classi generiche con un LBWC ( containerOne
, containerTwo
, containerThree
nel campione sopra) a :
- Essere assegnate alle istanze della classe generica (del parametro type
T
) ogni volta che è noto che RationalNumber
può essere tranquillamente convertito in T
.
Ora, usiamo questa conoscenza e proviamo a rispondere alla domanda: possiamo passare un Number
a un tale "handle" - una classe generica con un LBWC di RationalNumber
?
Dato che
- È valido assegnare un'istanza di
new List<RationalNumber>()
a un handle di List<? super RationalNumber> varGeneric
.
- Naturalmente è valido fare qualcosa di completamente diverso; ma il design di LBWC è che questa è la la situazione di cui ha bisogno di occuparsi.
Otteniamo questa domanda correlata:
- Possiamo chiamare
new List<RationalNumber>().add(new Number(...))
?
Visto che l'obiettivo di progettazione di LBWC è impedire che ciò accada, si può trarre questa conclusione:
- Se LBWC è progettato per essere applicabile a tutti (dal compilatore o dalla polizia linguistica), deve impedire questo incarico (inserendo
Number
per un tipo ?
per il quale LBWC è RationalNumber
) da accadendo.
Questo risponde alla domanda dal punto di vista del design. La questione dell'applicazione può essere risolta solo dai membri senior della comunità che hanno familiarità con la costruzione del linguaggio Java e dei suoi strumenti di compilazione. I commenti della folla generale forniranno solo speculazioni, o "ipotesi" o "teorie".