2015-07-05 10 views
7

Dlaczego ten kod nie pokazuje żadnego błędu kompilacji?W jaki sposób parametr w metodzie ogólnej można przypisać do klasy Integer i klasy Character w tym samym czasie?

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; 
    } 
} 

Jeśli piszemy normalną kod tak (pokazany poniżej)

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"); 
    } 
} 

Dlaczego powyższe powyżej działa dobrze, w jaki sposób można T będzie klasy Integer i tablicą T będzie klasy znaków w tym samym czasie, a jeśli działa, to dlaczego jego drukowanie nie jest prawdziwe, ASCII vaue "a" to 97, więc powinno się wydrukować prawdę.

Odpowiedz

6

Ponieważ kompilator wnioskuje Object jako argumentu typu dla wezwaniem

Non_genre.genMethod(a, arr3) 

w ciele tej metody

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

Twój parametr typu T jest nieograniczona, a więc mogą być postrzegane tylko jako Object.

Od x i elementów y są tego samego typu (T), można je porównywać dobrze.

if (r == x) 
+0

* Można porównywać wartości obiektu z innymi wartościami obiektów po prostu dobrze *. Brzmi to trochę niepoprawnie. Powinno być * Możesz porównać odniesienia do siebie po prostu dobrze * – CKing

+0

@ Sotirios-Ale jaki będzie typ T w każdej pętli, i dlaczego jej drukowanie jest fałszywe? –

+1

@RajMalhotra Ponieważ używasz '=='. To sprawdza tożsamość, a nie równość. – CKing

Powiązane problemy