Dlaczego ten kod się nie kompiluje?
public boolean isOf(Class clazz, Object obj){
if(obj instanceof clazz){
return true;
}else{
return false;
}
}
Dlaczego nie mogę przekazać zmiennej klasy do instanceof
?
java
class
instanceof
eric2323223
źródło
źródło
Integer
to nie dosłownym klasa.Integer.class
byłby literałem klasy (patrz § 15.8.2 JLS: java.sun.com/docs/books/jls/third_edition/html/… ).instanceof
Operator wykonuje "ReferenceType" (in nazwą typu), jak określono § 15.20.2 z JLS: java.sun.com/docs/books/jls/third_edition/html/...clazz.isInstance(obj)
ponieważ obiekt został już dostarczony.instanceof
może być używany tylko z jawnymi nazwami klas (podanymi w czasie kompilacji). Aby przeprowadzić kontrolę działania , wykonaj następujące czynności:Ma to niewielką przewagę,
clazz.isAssignableFrom(..)
ponieważ lepiej radzi sobie ze sprawąobj == null
.źródło
Jak wspominali inni, nie można przekazać zmiennej klasowej,
instanceof
ponieważ zmienna klasowa odwołuje się do instancji Object , podczas gdy prawa rękainstanceof
musi być typem . Oznacza to,instanceof
że nie oznacza „y jest wystąpieniem Obiektu x”, oznacza to „y jest wystąpieniem typu X”. Jeśli nie znasz różnicy między obiektem a typem, rozważ:Object o = new Object();
Tutaj typ jest
Object
io
jest odwołaniem do wystąpienia Object z tym typem. A zatem:if(o instanceof Object)
jest ważny, ale
if(o instanceof o)
nie dlatego, że
o
po prawej stronie znajduje się Obiekt, a nie typ.Bardziej specyficznie dla twojego przypadku, instancja klasy nie jest typem, jest to obiekt (który jest tworzony dla ciebie przez JVM). W twojej metodzie
Class
jest typem, aleclazz
jest obiektem (cóż, odniesieniem do obiektu)To, czego potrzebujesz, to sposób na porównanie obiektu z obiektem klasy. Okazuje się, że jest to popularny, więc to jest do was jako metody obiektu klasy:
isInstance()
.Oto dokumentacja Java dla isInstance, która wyjaśnia to lepiej:
źródło
Po pierwsze
instanceof
wymaga, aby operand po prawej stronie był rzeczywistą klasą (np.obj instanceof Object
Lubobj instanceof Integer
), a nie zmienną typuClass
. Po drugie, popełniłeś dość powszechny błąd początkującego, którego naprawdę nie powinieneś robić ... następujący wzór:Powyższe można przełożyć na:
Zawsze należy przeprowadzać tę refaktoryzację, ponieważ eliminuje ona zbędną instrukcję if ... else. Podobnie wyrażenie można refaktoryzować do tego samego wyniku.
return conditional_expression ? true : false;
źródło