2013-08-31 22 views
16
class A { 

    public static void main(String...args) { 
     Integer var = 10; 

     if(var instanceof Character) // Line1 
      System.out.println("var is a Character"); 
    } 
} 

wiem Linia 1 nie będzie kompilować, ponieważ kompilator stwierdził, że var nie jest Character.instanceof w Javie - dlaczego to się nie kompiluje?

Nie mogę zrozumieć, dlaczego kompilator zgłasza błąd zamiast zwracać false lub true.

Jeśli kompilator zwraca false lub true (tj leczenia operację instanceof jak regularnego sprawdzania, czy opartym na), to jest o wiele bardziej przydatne .. czy nie?

A może brakuje mi czegoś oczywistego?

+3

Zmień "Liczba całkowita zmienna = 10;" na "Obiekt zmienna = 10;". Kompilator mówi ci, że 'var' może ** nigdy ** nie być' instanceof Character' jeśli zadeklarujesz go jako 'Integer'. –

+5

Dlaczego jest on odrzucany? To dość uzasadnione pytanie. –

+0

@RohitJain Moje myśli dokładnie. –

Odpowiedz

18

Jest to błąd kompilacji zgodnie z JLS §15.20.2:

Jeżeli odlew RelationalExpression do ReferenceType zostanie odrzucony jako błąd kompilacji, a następnie instanceof wyrażenie relacyjne również produkuje błąd podczas kompilacji. W takiej sytuacji wynik wyrażenia instanceof nigdy nie byłby prawdziwy.

RelationalExpression jest pierwszy operand instanceof i ReferenceType jest drugim.

3

Ponadto do arshajii za odpowiedź jeśli chcesz uniknąć błędów kompilacji i chcą run-time prawdziwe/fałszywe wynik dla sprawdzenia, czy zmienna jest instancją Charakter następnie użyć kodu jak poniżej:

if(var.getClass().isAssignableFrom(Character.class)) 
    System.out.println("var is a Character"); 
else 
    System.out.println("var is NOT a Character"); 

Zgodnie z oczekiwaniami zostanie wydrukowany:

var is NOT a Character 
+3

Myślę, że podstawową cechą JLS jest to, że ten test ** nigdy ** nie zwraca "prawda", jeśli wiesz, że typ nie jest możliwy do przypisania. Jest to całkowicie bezcelowe - jeśli wiesz, że jest to 'Integer', to sprawdzenie jest zbędne,' return false' również zadziała. Jeśli nie wiesz, że 'var' jest' Integer', tzn. Masz 'Object', wtedy' instanceof' skompiluje się dobrze. –

+1

jest to przydatne, jeśli w mniejszym lub większym stopniu potrzebuję mniej kodu.Mam projekt przejścia dla pieszych w trybie współdzielonym w fazie rozwoju i tryb wbudowany do produkcji, używam 'if (this instanceWXWalkActivity)' do sprawdzenia, ale kompiluje błąd. 'https: // crosswalk-project.org/documentation/shared_mode.html' –