相当于instanceof

时间:2013-05-09 19:14:48

标签: java if-statement instanceof

如果不使用instanceof,相当于什么?使用true,false或else语句时可能更简单一些吗?

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

7 个答案:

答案 0 :(得分:3)

对于原始数组,您可以代替:

if (ar[i] instanceof int[])

使用:

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



注意: 上面的代码适用于基本类型的数组。但请注意,instanceof还会检查左侧部分中的对象是否是右侧部分中的类的子类型,而==则不是。(myInstance instanceof MyClass[])。 对于对象,相当于( MyClass[].class.isAssignableFrom( myInstance.getClass() ) ) (检查子类型)是:

{{1}}

答案 1 :(得分: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)
            ....
}

答案 2 :(得分: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;
        }
        //...

答案 3 :(得分:0)

通常,继承和多态性是解决问题的更好方法。不是检查你正在处理什么类型的对象,而是从泛型类继承几个类,并调用共享方法。

答案 4 :(得分:0)

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

对于数组的具体示例,它还有isArray()getComponentType()

答案 5 :(得分:0)

Class<?> intArrayCls = int[].class;

...

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

也可以做到这一点。

JavaDoc of isInstance。它更灵活,因为它不仅仅像接受的答案一样测试平等。

答案 6 :(得分: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之间的区别 What is the difference between instanceof and Class.isAssignableFrom(...)?