2012-09-18 8 views
6

Eventuali duplicati:
@SuppressWarnings for “extends String”Perché "T extends String" è permesso ma dà un avvertimento?

Perché T extends String è consentito, ma dà avvertimento?

Il tipo parametro T non deve essere limitato dal tipo di stringa finale. tipi finali non possono essere ulteriormente estesi

public class Car<T extends String> 

so cosa è definitiva so che è valida perché solo valore possibile di T can be String Mi chiedevo di avvertimento.

+2

Il messaggio di avviso dice tutto. Come puoi trovare una classe che estenda la stringa finale? Quindi 'T' sarà sicuramente un' String' – Raffaele

+0

@ Thor84no vedere la domanda modificata e la risposta [axtavt] (http://stackoverflow.com/a/12475147/315306) – Raffaele

risposta

13

Se la domanda reale è "perché è consentita", quindi immaginare una situazione quando si aggiunge final parola chiave alla classe esistente. Penso che tu non voglia che questa modifica infranga altri codici esistenti che usano questa classe come un limite generico, perché è ancora perfettamente legale. Ecco perché il compilatore non emette un errore in questo caso.

Dall'altro lato, si desidera essere informati se si utilizza accidentalmente la classe final come un limite generico, poiché tale costola non ha senso. Ecco perché il compilatore emette un avviso.

In realtà, è una pratica comune contrassegnare i costrutti legali ma privi di significato con avvisi.

1

Perché String in java è finale, i. e. non puoi estendere quella classe. Quindi hai l'avviso perché non esiste una classe che estende String.

+2

OP si chiede perché sia ​​permesso fare ? –

3

Fondamentalmente, si sta dicendo che esiste un solo tipo possibile per T e che è lo stesso String. Quindi in pratica la tua classe generica Car è generica solo nel nome. Si può anche solo sostituire tutte le istanze di T nella classe con String.

Forse intendevi public class Car<T extends CharSequence> ...


Il costrutto è consentito perché la classe è significativo, e forse anche utile. L'avvertimento è dato perché (secondo il parere degli autori del compilatore) probabilmente hai fatto un errore. Il ragionamento è lo stesso che per l'avvertimento che alcuni compilatori vi darà la seguente:

String NULL = null; 
System.err.println(NULL.toString()); 

Questo è significativo, ma è un errore ... a meno che non si ha intenzione ad un'eccezione.


Mi vengono in mente due scenari in cui public class Car<T extends SomeFinalClass> non è un errore:

  • Il caso in cui SomeFinalClass in origine non era final.
  • Il caso in cui il codice per Car viene generato automaticamente e sarebbe scomodo generare codice del caso speciale per le classi final.
Problemi correlati