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