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

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

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

在里面我需要做类似的事情

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

但这不会编译。

我想你想要aClass.isInstance( v2 ) 。 文档说它与instanceOf关键字的工作原理相同 。 我猜他们不能使用instanceOf作为方法名称,因为关键字不能用作方法名称。

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

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

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

正如Hovercraft Full Of Eels所提到的,您通常可以通过依靠编译器为您进行检查来避免此类显式方法调用。 一些方法:

  • 您正在编写一个通用类型的容器。 让事物的类型为T ,然后Java允许您表达如下:

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

    然后创建MyClass实例,如下所示: MyClass m = new MyClass(); 或者从Java 7开始: MyClass m = new MyClass<>();

  • 你真的需要Class,比如因为你正在使用Enum类型和许多那些使用相关类进行参数化的方法:

    public void check(Class validClsAutomaticallyChecked) {}

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

    public void pass(SuperType thatSimple) {}

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

    public void workWith(T genericallyTypedObject) {}

你也可以尝试:

 aClass.isAssignableFrom(v2.getClass()) 

其中“aClass”是“v2”的超类