Perché T è limitato da Object nella firma Collections.max ()?

Ho appena eseguito l’implementazione della class java.util.Collections di Java 7 e ho visto qualcosa che non capisco. Nella firma della funzione max , perché T è limitata da Object ?

 public static <T extends Object & Comparable> T max(Collection coll) { Iterator i = coll.iterator(); T candidate = i.next(); while (i.hasNext()) { T next = i.next(); if (next.compareTo(candidate) > 0) candidate = next; } return candidate; } 

max sembra funzionare bene se il limite dell’object viene omesso.

 public static <T extends Comparable> T max(Collection coll) { Iterator i = coll.iterator(); T candidate = i.next(); while (i.hasNext()) { T next = i.next(); if (next.compareTo(candidate) > 0) candidate = next; } return candidate; } 

Ci sono effettivamente situazioni in cui il limite fa la differenza? In caso affermativo, fornire un esempio concreto.

I due hanno gli stessi limiti ma c’è una sottile differenza.

  > 

Ciò causerà che T diventi un Object in cancellazione.

  > 

Ciò causerà che T diventi Comparable in cancellazione.


In questo caso è fatto perché .max precede Java 5. Possiamo vedere in questo collegamento Joachim gentilmente a condizione che la firma di .max in Java 1.4.2 sia:

 public static Object max(Collection coll) 

Avevamo usato > > come rilegato, la nostra firma sarebbe

 public static Comparable max(Collection coll) 

Quale interromperà le API. Sono riuscito a trovare questa pagina che discute la conversione di vecchie API in generiche e fornisce .max come esempio specifico.

Qui spiegano perché max è definito in questo modo:

È inoltre necessario assicurarsi che l’API revisionata mantenga la compatibilità binaria con i vecchi client. Ciò implica che la cancellazione dell’API deve essere uguale all’API originale non generata. Nella maggior parte dei casi, questo cade naturalmente, ma ci sono alcuni casi sottili. Esamineremo uno dei casi più sottili che abbiamo incontrato, il metodo Collections.max() . Come abbiamo visto nella sezione More Fun with Wildcards, una firma plausibile per max() è:

public static > T max(Collection coll) public static > T max(Collection coll) Questo va bene, tranne che la cancellazione di questa firma è: public static Comparable max(Collection coll) che è diversa dalla signature originale di max (): public static Object max(Collection coll)

Uno potrebbe certamente aver specificato questa firma per max (), ma non è stato fatto, e tutti i vecchi file di class binari che chiamano Collections.max () dipendono da una firma che restituisce Object.