0

不使用 instanceof 的情况是什么?也许在使用 true、false 或 else 语句时更简单?

public static void p (Object...ar)
{
        for (int i=0; i < ar.length; i++)
        {
                if (ar[i] instanceof int[])
                {
4

7 回答 7

4

对于原始数组,您可以,而不是:

if (ar[i] instanceof int[])

利用:

if (ar[i].getClass() == int[].class)



注意: 上面的代码适用于原始类型的数组。但是请注意,它instanceof还会检查左侧的对象是否是右侧类的子类型,而==不是。
对于objects,等价于(myInstance instanceof MyClass[])(检查子类型)是:

(   MyClass[].class.isAssignableFrom(  myInstance.getClass()  )   )
于 2013-05-09T19:21:11.560 回答
1

你可以使用:

(getClass().isArray())

并检查是否为整数数组:

 ar.getClass().toString().equals("class [I")

更新

if(ar.getClass().isArray()) {
        if(ar[i].getClass() == int[].class)
            ....
        else if(ar[i].getClass() == String[].class)
            ....
}
于 2013-05-09T19:16:53.863 回答
1

另一种选择是假设它是一个int[],如果不是,则捕获结果异常:

public static void p (Object...ar)
{
    for (int i=0; i < ar.length; i++)
    {
        int[] i_arr;
        try {
            i_arr = (int[]) ar[i];
        } catch (ClassCastException e) {
            continue;
        }
        //...
于 2013-05-09T19:17:56.653 回答
0

通常,继承和多态是解决问题的更好方法。与其检查您正在处理的对象类型,不如让多个类从一个泛型类继承,并调用共享方法。

于 2013-05-09T19:16:41.067 回答
0

查看 java.lang.Class,它有一个方法isAssignableFrom(Class<?> cls)

对于您使用数组的特定示例,它还具有 isArray()getComponentType()

于 2013-05-09T19:17:59.870 回答
0
Class<?> intArrayCls = int[].class;

...

if (intArrayCls.isInstance(ar[i])) {

也会成功的。

isInstance 的 JavaDoc。它更灵活一点,因为它不仅像接受的答案那样测试相等性。

于 2013-05-09T20:01:18.703 回答
0

使用 isAssignableFrom

public static void test(Object... args) {
    for (int i = 0; i < args.length; i++) {
       if (args[i].getClass().isAssignableFrom(int[].class)) {
        System.out.println("true");
       } else {
            System.out.println("false");
       }
    }
}

您也可以以动态方式使用 isAssignableFrom,请参阅这篇文章以了解 instanceof 和 isAssignableFrom 之间的区别 instanceof 和 Class.isAssignableFrom(...) 之间的区别是什么?

于 2013-05-09T20:09:51.980 回答