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"