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

23

我的方法以类(Class)作为参数,我需要检查其中一个变量是否为该类的类型。

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

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

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

但是这个无法编译。


编译器不应该能够为您检查吗?您如何声明检查方法? - Hovercraft Full Of Eels
v2 instanceof Class ? "True" : "False" => v2 instanceof ? "是的" : "不是"); - Nabin
1
我在这里闻到了可能存在反模式的味道,并再次想知道使用泛型来更好地指定参数类型是否是一种更好、更干净的解决方案,以允许问题在编译时而不是运行时得到解决。 - Hovercraft Full Of Eels
1
我已经写了一个答案,概述了避免对原始类类型参数执行操作的方法。大多数情况下,如@HovercraftFullOfEels已经提到的那样,您不需要这样做,因为Java提供了让编译器为您进行检查的方法。 - user268396
4个回答

32

我认为你想要的是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 );

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

2
这可能有助于解释这是做什么的/为什么它是一个有效的答案。 - Whymarrh

4
如同 Hovercraft Full Of Eels 提到的,可以通过让编译器为你进行检查来避免这样的显式方法调用。以下是一些方法:
1. 如果您正在编写一个泛型类型的容器,让事物的类型为 T,则 Java 允许您按如下方式表达: ``` public class MyClass { private T thing; public void setThing(T t) { this.thing = t; } private void check(Class cls) {} // 可能不必要 } ``` 然后创建 `MyClass` 的实例如下:`MyClass m = new MyClass();` 或者自Java 7以来:`MyClass m = new MyClass<>();`
2. 您确实需要 Class,比如因为您正在使用 Enum 类型,并且许多这些方法都是使用相关 Class 参数化的: ``` public void check(Class validClsAutomaticallyChecked) {} ```
3. 您只需要传递特定超类型的对象给方法: ``` public void pass(SuperType thatSimple) {} ```
4. 您不需要、不能或不会使包含类接受要传递的东西的类型参数,但您仍然希望在方法中利用泛型。这可能很有用,以允许编译器推断您在方法体内所做的操作是安全的。例如,您可能希望基于作为方法参数传递的东西的类型创建类型为 `T` 的事物集合。 ``` public void workWith(T genericallyTypedObject) {} ```

1
你也可以尝试:
aClass.isAssignableFrom(v2.getClass())

“aClass”是“v2”的超类。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接