2010-04-07 12 views

Odpowiedz

111

Operator instanceof działa na typach odniesienia, takich jak Integer, a nie na obiektach, takich jak new Integer(213). Prawdopodobnie chcesz coś

clazz.isInstance(obj) 

marginesie: Twój kod będzie bardziej zwięzły jeśli piszesz

public boolean isOf(Class clazz, Object obj){ 
    return clazz.isInstance(obj) 
} 

naprawdę nie jestem pewien, czy trzeba już metody, chociaż.

+0

Znam kod jest całkowicie bezużyteczny , Chcę tylko zademonstrować moje zamieszanie :) – eric2323223

+6

'Integer' to ** not ** a literal class. 'Integer.class' będzie literałem klasy (zobacz § 15.8.2 z JLS: http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.8.2). Operator 'instanceof' pobiera" ReferenceType "(inaczej nazwa typu), jak określono w § 15.20.2 JLS: http://java.sun.com/docs/books/jls/third_edition/html/expressions.html# 15.20.2 –

+2

Użyłbym 'clazz.isInstance (obj)', ponieważ obiekt został już dostarczony. –

12

instanceof może być używany tylko z jawnymi nazwami klas (określonymi w czasie kompilacji). W tym celu do Runtime czek, należy zrobić:

clazz.isInstance(obj) 

ten ma niewielką przewagę nad clazz.isAssignableFrom(..) ponieważ dotyczy przypadku obj == null lepiej.

3

Najpierw instanceof wymaga operand po prawej rzeczywiste klasy (np obj instanceof Object lub obj instanceof Integer), a nie zmiennym typu Class. Po drugie, dokonały dość powszechne newbie błąd, że naprawdę nie powinno robić ... następujący wzór:

 
if (conditional_expression){ 
    return true; 
} else{ 
    return false; 
} 

Powyższe może być refactored do:

 
return conditional_expression; 

Należy zawsze wykonać tę refaktoryzacji , ponieważ eliminuje nadmiarową instrukcję if ... else. Podobnie, wyrażenie return conditional_expression ? true : false; może być refaktoryzowane do tego samego wyniku.

+2

To nie jest błąd. Może niezdarny, ale w porządku. Może potrzebujesz dodatkowego kodu przed powrotem w dającej się przewidzieć przyszłości ... –

2

Jak wspominają inni, nie można przekazać zmienną do klasy instanceof ponieważ klasa zmienne odniesienia wystąpienie Object, podczas gdy prawa ręka instanceof musi być typ. Oznacza to, że instanceof nie oznacza "y jest instancją Obiektu x", to znaczy "y jest instancją typu X". W przypadku, gdy nie zna różnicy między obiektem i typu, należy rozważyć:

Object o = new Object();

Tutaj typ jest Object i o jest odwołaniem do wystąpienia obiektu z danego typu. Zatem:

if(o instanceof Object)

jest ważna ale

if(o instanceof o)

nie dlatego o na prawej stronie jest przedmiotem, a nie typu.

Specyficzna dla twojego przypadku instancja klasy nie jest typem, jest to obiekt Obiekt (który jest tworzony dla ciebie przez JVM). W Twojej metodzie Class jest typem, ale jest Obiektem (dobrze, odniesienie do Obiektu). Okazuje się, że jest to popularne, więc przekazujemy je jako metodę klasy Object: isInstance().

Oto Java Doc dla isinstance, która wyjaśnia to lepiej:

public boolean isInstance(Object obj)

Określa, czy określony obiekt jest przypisanie zgodny z przedmiotem reprezentowanym przez tę klasę. Ta metoda jest dynamicznym odpowiednikiem operatora instanceof języka Java. Metoda zwraca wartość true, jeśli podany argument Object ma wartość inną niż null i można go rzutować na typ odniesienia reprezentowany przez ten obiekt Class bez podwyszenia wyjątku ClassCastException. W przeciwnym razie zwraca false.

W szczególności, jeśli ten obiekt klasy reprezentuje zadeklarowaną klasę, ta metoda zwraca wartość true, jeśli podany argument Object jest instancją klasy reprezentowanej klasy (lub którejkolwiek z jej podklas); w przeciwnym razie zwraca wartość false . Jeśli ten obiekt klasy reprezentuje klasę tablicową, ta metoda zwraca wartość true, jeśli określony argument Object może zostać przekonwertowany na obiekt klasy tablicowej przez konwersję tożsamości lub przez poszerzoną konwersję referencyjną o numer ; w przeciwnym razie zwraca false. Jeśli ten obiekt klasy reprezentuje interfejs, ta metoda zwraca wartość true, jeśli klasa lub jakakolwiek nadklasa klasy podanego argumentu Object implementuje ten interfejs; zwraca wartość false w przeciwnym razie. Jeśli ten obiekt klasy reprezentuje typ pierwotny , ta metoda zwraca wartość false.

Parametry: obj - obiekt do sprawdzenia
Powroty: true jeśli obj jest instancją tej klasy
od: zestawu JDK 1.1

Powiązane problemy