Quali disegni Java sono fatte esplicitamente per supportare la compatibilità all'indietro? [chiuso]

StackOverflow https://stackoverflow.com/questions/961986

  •  12-09-2019
  •  | 
  •  

Domanda

questa domanda è tornato a quattro voti per chiudere, sto cercando ancora una volta di porre una domanda più stretta che si spera la comunità visualizzare più favorevole.

Quali decisioni di progettazione specifici in Java sono documentati per essere fatto nel modo che essi non sono perché quella era la decisione di design preferito, ma piuttosto perché è stato necessario per sostenere la compatibilità all'indietro.

Il caso evidente è Generics, dove non è possibile rilevare il tipo di parametro in fase di esecuzione. (Così non si può fare:

 public void addEmptyMember(List<?> someList) {
      if (someList instanceof List<String>) {
            ((List<String>) someList).add("");
      }
 }

Quello che esistono altri esempi nella progettazione lingua e API standard?

È stato utile?

Soluzione

Perché questa domanda non ha una sola risposta giusta, non so se sarà la cavano meglio di tua altra domanda.

Tre caratteristiche che mi viene in mente (in aggiunta alla cancellazione generica, che già citato) che ha fatto compromessi in nome della retrocompatibilità sono stati la nuova sintassi del ciclo, varargs e autoboxing.

Il nuovo ciclo per la sintassi probabilmente avrebbe dovuto leggere for (item in List), ma che avrebbe richiesto facendo in in una parola riservata. Ciò causato numerosi problemi di compatibilità all'indietro, non ultimo dei quali è il fatto che System.in dovrebbe essere rinominato.

varargs e autoboxing sia aggiunto la possibilità di ambiguità. Ad esempio, se si passa una matrice di oggetti a un metodo che accetta Object... significa che la matrice deve essere passato come matrice vararg o come elemento dell'array vararg? Questo diventa ancora più complicato se ci sono sovraccarichi. Autoboxing ha problemi ambiguità simili con sovraccarico. La soluzione a entrambi questi problemi è stato quello di rendere una regola che quando il metodo per risolvere le chiamate vengono prima risolti con le regole pre-1.5 (cioè: non autoboxing, e Object... è trattata come Object[]). Solo se la chiamata al metodo non può essere risolto con il pre-1.5 regole sono le nuove regole 1.5 considerate.

Altri suggerimenti

Ci sono molti esempi nella libreria standard

  • java.awt.Color ha le stesse costanti con nomi maiuscole e minuscole
  • Tutti i metodi deprecati in java.util.Date dato l'introduzione di java.util.Calendar - che casino !!
  • java.util.Enumeration ancora in uso in cui java.util.Iterator potrebbe sostituirlo
  • Corsi in swing che accettano vettori come argomenti, ma potrebbero avere il supporto aveva aggiunto per java.util.Collection

Un altro sarebbe tutte le classi ei metodi che sono obsoleti per più versioni ormai, ma solo che non andrà via. Degna di nota sono i vari metodi della discussione, che sono obsoleti.

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