2015-07-06 12 views
5

dato un'interfaccia generica:generici Java, interfacce e vincoli di tipo

public interface I<E> { 
    public int interfaceMethod(E s); 
} 

e una classe generica che implementa l'interfaccia

public class A<T> implements I<T> { 

    private T val; 

    public A(T x) { 
     val = x; 
    } 

    public int interfaceMethod(T val) { 
     // looks like T should be of the same type as instance variable 'val' 
     return 0; 
    } 

} 

perché fa i seguenti lavori?

public class Run { 

    public static void main(String[] args) { 

     A a = new A<String>("hello"); 

     System.out.println(a.interfaceMethod(100)); \\ returns 0 
    } 
} 

previsto Il parametro T tipo di metodo interfaceMethod come definito in class A per vincolare il metodo di argomenti che hanno lo stesso tipo di quello fornito al costruttore di A. (in questo caso String).

Perché lo a.interfaceMethod non richiede un argomento di tipo String?

+0

probabilmente perché non ha fatto il seguente 'A a = new A ("ciao");' ... – beoliver

+0

Oserei che il numero intero è implicitamente cast String http://stackoverflow.com/ domande/9159358/implicito-cast-to-string-tostring-and-int – JoSSte

+0

http://stackoverflow.com/questions/2770321/che cosa-is-a-raw-tipo-e- e- perché -shouldnt-we-use- it –

risposta

1

Mentre le altre risposte spiegavano che normalmente dovrebbe apparire un avviso del compilatore. La spiegazione che stavo cercando è arrivata sotto forma di link to a previous post fornita da @JB Nizet.

T t = new T<S>()

non è la stessa

T<S> t = new T<S>()

Il primo è un esempio di un tipo grezzo . Ero interessato a perché il funziona (ad esempio ... se compila e non genera un errore di runtime), allora deve esserci qualcosa.

Le risposte di questo post sono dettagliate e spiegano esattamente perché questo compila (lunga storia, compatibilità con le versioni precedenti). Il post va in dettaglio e spiega le implicazioni per il sistema di tipi di Java.

1

Questo accade perché hai ignorato l'avvertimento "l'uso crudo di parametro a" (o qualcosa di simile)

Usa:

A<String> a = new A<String>("hello"); 

Quando ignorando gli avvertimenti relativi generici il codice può compilare quando non dovrebbe .

+0

Non c'erano avvisi ... O questi avvisi di java-docs? – beoliver

+0

Se si utilizza intellij/eclipse si dovrebbero vedere gli avvertimenti a meno che non siano disabilitati. – BobTheBuilder

+0

Segnala sicuramente un avviso: * Run.java utilizza operazioni non controllate o non sicure. Ricompila con -Xlint: deselezionata per i dettagli. * –

1

Questo funziona perché a esempio viene digitato per A classe solo
Si dovrebbe digitare in questo modo:

A<String> a = new A<String>("hello"); 

Se voi non specifica il parametro, si sarà in grado di mettere lì tutti i tipi di dati come String , int ecc.

+0

Hai ragione, @JBNizet, rimosso – maskacovnik

+0

Spiacente, visto e migliorato adesso @JBNizet – maskacovnik