Как уже упоминалось, вы не можете передать переменную класса в instanceof
, потому что переменная класса ссылается на экземпляр Object , тогда как правая рука instanceof
должна быть тип .То есть instanceof
не означает «y является экземпляром объекта x», это означает «y является экземпляром типа X».В случае, если вы не знаете разницу между объектом и типом, рассмотрите:
Object o = new Object();
Здесь типом является Object
, а o
является ссылкой наэкземпляр объекта с этим типом.Таким образом:
if(o instanceof Object)
допустимо, но
if(o instanceof o)
не потому, что o
справа является объектом,не тип.
Более конкретно для вашего случая, экземпляр класса не является типом, это Object (который создается для вас JVM).В вашем методе Class
- это тип, но clazz
- это объект (ну, ссылка на объект)
Вам нужен способ сравнения объекта с объектом класса.Оказывается, это популярно, поэтому вам предоставляется метод класса Object: isInstance()
.
Вот документ Java для isInstance, который объясняет это лучше:
public boolean isInstance(Object obj)
Определяет, является ли указанный объект совместимым с назначением с представленным объектомэтим классом.Этот метод является динамическим эквивалентом оператора instanceof языка Java.Метод возвращает значение true, если указанный аргумент Object не равен NULL и может быть приведен к ссылочному типу, представленному этим объектом Class, без вызова ClassCastException.В противном случае он возвращает false.
В частности, если этот объект Class представляет объявленный класс, этот метод возвращает true, если указанный аргумент Object является экземпляром представленного класса (или любого из его подклассов);в противном случае он возвращает false.Если этот объект Class представляет класс массива, этот метод возвращает значение true, если указанный аргумент Object может быть преобразован в объект класса массива путем преобразования идентификаторов или путем расширения ссылочного преобразования;в противном случае он возвращает false.Если этот объект Class представляет интерфейс, этот метод возвращает значение true, если класс или любой суперкласс указанного аргумента Object реализует этот интерфейс;в противном случае он возвращает false.Если этот объект Class представляет примитивный тип, этот метод возвращает false.
Параметры: obj - проверяемый объект
Возвращает: true, если obj являетсяЭкземпляр этого класса
С: JDK1.1