2015-07-05 6 views
7

Perché questo codice non mostra errori di compilazione?In che modo un parametro in un metodo generico può essere assegnato a un intero ea una classe di caratteri contemporaneamente?

public class Generic 
{ 
    public static void main(String[] args) 
    { 
     Character[] arr3={'a','b','c','d','e','f','g'}; 
     Integer a=97; 
     System.out.println(Non_genre.genMethod(a,arr3)); 
    } 
} 

class Non_genre 
{ 
    static<T> boolean genMethod(T x,T[] y) 
    { 
     int flag=0; 
     for(T r:y) 
     { 
      if(r==x) 
       flag++; 
     } 
     if(flag==0) 
      return false; 
     return true; 
    } 
} 

Se si scrive un codice normale così (mostrato di seguito)

public class Hello 
{ 
    public static void main(String[] args) 
    { 
     Character arr=65; 
     Integer a='A'; 
     if(arr==a) //Compilation Error,shows Incompatible types Integer and Character 
      System.out.println("True"); 
    } 
} 

Allora perché sopra sopra è in esecuzione bene, come può T essere di classe integer e array di T essere di classe Character allo stesso tempo, e se è in esecuzione allora perché non sta stampando true, il valore ASCII di 'a' è 97, quindi dovrebbe essere stampato true.

risposta

6

Poiché il compilatore deduce Object come un argomento di tipo per la vostra invocazione

Non_genre.genMethod(a, arr3) 

All'interno del corpo di tale metodo

static <T> boolean genMethod(T x, T[] y) { 

tuo parametro di tipo T è illimitato, e quindi può essere visto solo come Object.

Dal x e gli elementi di sono dello stesso tipo (T), possono essere confrontati perfettamente.

if (r == x) 
+0

* È possibile confrontare i valori dell'oggetto con altri valori di oggetto solo *. Sembra un po 'scorretto. Dovrebbe essere * È possibile confrontare i riferimenti l'uno con l'altro semplicemente * – CKing

+0

@ Sotirios-Ma quale sarà il tipo di T in per ogni ciclo e perché la sua stampa è falsa? –

+1

@RajMalhotra Perché stai usando '=='. Questo controlla l'identità, non l'uguaglianza. – CKing

Problemi correlati