2013-08-26 17 views
6

starałem się używać getClass() metody i mieć następujący kod:Zastosowanie metody getClass() metoda

class parent{} 
class child extends parent{} 
public class test { 
    public static void main(String[] args){ 
     child b= new child(); 
     System.out.println(b.getClass()==parent.class); 
    } 
} 

Mam kompilacji błędzie Incompatible operand types Class<capture#1-of ? extends child> and Class<parent>, i to jest w porządku, gdybym initilize bz Object b= new child(); . Czy ktoś może mi powiedzieć, jaka jest między nimi różnica?

Z góry dziękuję.

Odpowiedz

6

Od czasu wprowadzenia generycznych w Javie 5, klasa java.lang.Class jest ogólna na typie, który reprezentuje. Umożliwia to konstruowanie obiektu za pomocą ich obiektów bez obsady i włącza inne przydatne idiomy.

Dlatego kompilator może stać się zbyt inteligentny i zobaczyć, że jest w stanie ocenić wyrażenie w całości podczas kompilacji: twoje wyrażenie jest zawsze false. Kompilator podaje błąd kompatybilności typów, ale jest to bezpośredni wynik wyrażenia będącego stałą czasu kompilacji.

Jednym ze sposobów uniknięcia takiej sytuacji jest użycie java.lang.Object jako typu. Gdy to zrobisz, kompilator nie będzie mógł dokładnie oszacować wyniku typu getType, dzięki czemu uniknie błędu.

Innym sposobem rozwiązania tego problemu byłoby odlewania typ zwracany do non-generic Class

System.out.println(((Class)b.getClass())==parent.class); 

lub za pomocą pośrednią zmienną non-rodzajowego typu:

Class bClass = b.getClass(); 
System.out.println(bClass==parent.class); 
+0

+1 że sens. Dziękuję Ci. –

+0

Dzięki :-) wymyśliłem to. – labyrlnth

1

tego błędu komunikat zasadniczo oznacza, że ​​kompilator może stwierdzić, kiedy kompiluje program, że odpowiedź na tę kontrolę równości będzie zawsze fałszywa. Ponieważ wie, że klasa potomna i klasa nadrzędna nigdy nie mogą być równe, odmawia ona skompilowania kodu.

-1

jeśli chcesz ocenić, czy b.getClass() dziedziczy parent.class, proponuję użyć tej metody:

public static boolean judgeInherit(Class targetClass,Class supClass){ 
    Class supperClass = targetClass; 
    while(supperClass !=null){//if have supper class 
     if(supperClass == supClass){ 
      system.out.println(targetClass.getName() + " inherit "+supClass.getName()); 
      return true; 
     } 
      supperClass = supperClass.getSupperclass(); 
    } 
     return false; 
    } 

i nazywają

system.out.println(judgeInherit(b.getClass(),parent.class)); 
+0

'Class.isAssignableFrom()' i 'Class.isInstance()' już to robią i nie odpowiada na pytanie. – EJP

+0

dzięki, nie znam tej metody wcześniej. –

Powiązane problemy