java - 如何检查我的对象是否属于给定类的类型?

时间:2014-09-21 16:27:31

标签: java class

我的方法将Class作为参数,我必须检查我的变量是否为类型类型。

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

我需要做一些像

这样的事情
   v2 instanceof aClass  ? "True" : "False");

但这不会编译。

4 个答案:

答案 0 :(得分:30)

我想你想要aClass.isInstance( v2 )docs say it works the same as the instanceOf个关键字。我猜他们不能使用instanceOf作为方法名称,因为关键字不能用作方法名称。

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

或者只是使用一个类文字,如果“Volvo”是一个常数。

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

答案 1 :(得分:16)

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

答案 2 :(得分:4)

正如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<>();

  • 你真的需要Class,比如因为你正在使用Enum类型,并且很多这些方法都使用相关的类进行参数化:

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

  • 您只需要将特定超类型的对象传递给方法:

    public void pass(SuperType thatSimple) {}

  • 您不需要,不能或不会使您的包含类采用要传递的事物的类型参数,但您仍希望在方法中利用泛型。这可能有助于编译器推断出您在方法体内执行的操作是安全的。例如,您可能希望根据作为方法参数传递的事物类型创建类型为T的事物的集合。

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

答案 3 :(得分:1)

您也可以尝试:

aClass.isAssignableFrom(v2.getClass())

在哪里&#34; aClass&#34;是&#34; v2&#34;

的超类