Java - Как проверить, является ли мой объект типом данного класса?

Мой метод получает Class как параметр, и я должен проверить, что одна из моих переменных имеет тип класса.

Volvo v1 = new Volvo();
Class aClass = v1.getClass();
check(aClass);

внутри мне нужно сделать что-то вроде

   v2 instanceof aClass  ? "True" : "False");

но это не компилируется.

Ответы

Ответ 1

Я думаю, вы хотите aClass.isInstance( v2 ). docs говорят, что он работает так же, как и ключевое слово instanceOf. Я думаю, они не могут использовать instanceOf как имя метода, потому что ключевые слова не могут использоваться как имена методов.

v2 = ???
Volvo v1 = new Volvo();
Class aClass = v1.getClass();
aClass.isInstance( v2 )       // "check(aClass)"

Или, может быть, просто используйте литерал класса, если "Volvo" является постоянной.

v2 = ???
Volvo.class.isInstance( v2 );

Ответ 2

    Volvo v = new Volvo();
    if (v instanceof Volvo) {
        System.out.println("I'm boxy, but safe.");
    }

Ответ 3

Как упоминалось в Hovercraft Full Of Eels, вы можете вообще избегать таких явных вызовов методов, опираясь на компилятор, чтобы выполнить проверку для вас. Некоторые подходы:

  • Вы пишете контейнер типично типизированной вещи. Пусть тип вещи T, тогда Java позволяет выразить это следующим образом:

    public class MyClass<T> { private T thing; public void setThing(T t) { this.thing = t; } private void check(Class<T> cls) {} // probably not necessary }

    Затем создайте экземпляры MyClass<T> следующим образом: MyClass<Volvo> m = new MyClass<Volvo>(); или так как Java 7: MyClass<Volvo> m = new MyClass<>();

  • Вам действительно нужен класс, скажем, потому что вы работаете с типами Enum и многие из этих методов параметризированы с использованием соответствующего класса:

    public void check(Class<?extends SuperType> validClsAutomaticallyChecked) {}

  • Вам просто нужен объект определенного супертипа для передачи методу:

    public void pass(SuperType thatSimple) {}

  • Вам не нужно, не может или не будет делать, чтобы ваш содержащий класс принимал параметр типа передаваемой вещи, но вы все равно хотите использовать дженерики в своем методе. Это может быть полезно, чтобы позволить компилятору сделать вывод о том, что то, что вы делаете внутри тела метода, безопасно. Например, вы можете создать коллекцию вещей типа T на основе типа передаваемой в качестве параметра метода.

    public <T> void workWith(T genericallyTypedObject) {}

Ответ 4

Вы также можете попробовать:

aClass.isAssignableFrom(v2.getClass())

Где "aClass" является суперклассом "v2"