我在想在Java中是否有更好的方法来否定instanceof。 实际上,我在做这样的事情:

if(!(myObject instanceof SomeClass)) { /* do Something */ }

但我认为应该有一个“漂亮的”语法来做到这一点。

有人知道它是否存在吗?它的语法是什么样的?


编辑: 说到美丽,我可以这样说:

if(myObject !instanceof SomeClass) { /* do Something */ } // compilation fails

当前回答

如果您可以使用静态导入,并且您的道德准则允许这样做

public class ObjectUtils {
    private final Object obj;
    private ObjectUtils(Object obj) {
        this.obj = obj;
    }

    public static ObjectUtils thisObj(Object obj){
        return new ObjectUtils(obj);
    }

    public boolean isNotA(Class<?> clazz){
        return !clazz.isInstance(obj);
    }
}

然后……

import static notinstanceof.ObjectUtils.*;

public class Main {

    public static void main(String[] args) {
        String a = "";
        if (thisObj(a).isNotA(String.class)) {
            System.out.println("It is not a String");
        }
        if (thisObj(a).isNotA(Integer.class)) {
            System.out.println("It is not an Integer");
        }
    }    
}

这只是一个流畅的界面练习,我从来不会在现实生活中使用它! 使用您的经典方式,它不会使其他阅读您的代码的人感到困惑!

其他回答

不,没有更好的办法;你的是典型的。

我不知道当你说“美丽”的时候你会想到什么,但是这个呢?我个人认为它比你发布的经典形式更糟糕,但有人可能会喜欢它……

if (str instanceof String == false) { /* ... */ }

如果您可以使用静态导入,并且您的道德准则允许这样做

public class ObjectUtils {
    private final Object obj;
    private ObjectUtils(Object obj) {
        this.obj = obj;
    }

    public static ObjectUtils thisObj(Object obj){
        return new ObjectUtils(obj);
    }

    public boolean isNotA(Class<?> clazz){
        return !clazz.isInstance(obj);
    }
}

然后……

import static notinstanceof.ObjectUtils.*;

public class Main {

    public static void main(String[] args) {
        String a = "";
        if (thisObj(a).isNotA(String.class)) {
            System.out.println("It is not a String");
        }
        if (thisObj(a).isNotA(Integer.class)) {
            System.out.println("It is not an Integer");
        }
    }    
}

这只是一个流畅的界面练习,我从来不会在现实生活中使用它! 使用您的经典方式,它不会使其他阅读您的代码的人感到困惑!

通常情况下,你不仅需要if,还需要else子句。

if(!(str instanceof String)) { /* do Something */ } 
else { /* do something else */ }

可以写成

if(str instanceof String) { /* do Something else */ } 
else { /* do something */ }

或者你可以写代码,所以你不需要知道它是否是一个字符串。如。

if(!(str instanceof String)) { str = str.toString(); } 

可以写成

str = str.toString();

你可以使用这个类。isInstance方法:

if(!String.class.isInstance(str)) { /* do Something */ }

... 但它还是被否定了,而且很难看。