繁体   English   中英

相当于instanceof

[英]The equivalent of instanceof

不使用instanceof的等效项是什么? 使用true,false或else语句时,也许更简单些?

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

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

if (ar[i] instanceof int[])

采用:

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



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

(   MyClass[].class.isAssignableFrom(  myInstance.getClass()  )   )

您可以使用:

(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)
            ....
}

另一个选择是假设它是一个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;
        }
        //...

通常,继承和多态是解决问题的更好方法。 不必检查要处理的对象类型,而是要从一个通用类继承几个类,然后调用共享方法。

检出具有方法isAssignableFrom(Class<?> cls) java.lang.Class。

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

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

...

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

也会做到这一点。

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

使用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(...)之间有什么区别?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM