"否定"一个实例的最佳方式

caa*_*os0 381 java syntax

我在想是否存在更好/更好的方法来否定instanceofJava中的内容.实际上,我正在做的事情如下:

if(!(str instanceof String)) { /* do Something */ }
Run Code Online (Sandbox Code Playgroud)

但我认为应该存在一个"漂亮"的语法.

有谁知道它是否存在,以及语法是什么样的?


编辑: 美丽,我可能会这样说:

if(str !instanceof String) { /* do Something */ } // compilation fails
Run Code Online (Sandbox Code Playgroud)

mae*_*ics 296

不,没有更好的方法; 你的是规范的.

  • @arun 这是我们都讨厌的语法,原始发帖者询问如何避免。 (4认同)

Nat*_*tix 124

当你说"美丽"时,我不知道你的想象,但是这个怎么样?我个人认为它比你发布的经典形式更糟糕,但有人可能会喜欢它......

if (str instanceof String == false) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

  • 看到这一点可以帮助我理解 `if(!(str instanceof String))` 是唯一正确的方法,我需要停止考虑替代方案 (5认同)
  • 关于双重逻辑,可以使用`!= true`代替`== false`:D (2认同)

dac*_*cwe 56

你可以使用这个Class.isInstance方法:

if(!String.class.isInstance(str)) { /* do Something */ }
Run Code Online (Sandbox Code Playgroud)

......但它仍然被否定,非常丑陋.

  • @ChrisCooper这不是真的:如果指定的Object参数是所表示的类(或其任何子类)的实例,则此方法返回true. (7认同)
  • 更好一点,多余的括号使代码变得丑陋,恕我直言. (5认同)
  • 这有不同的行为.instanceof关键字包含子类,方法没有,您需要使用Class.isAssignableFrom来复制行为. (4认同)

Pet*_*rey 22

通常你也不想只是if一个else条款.

if(!(str instanceof String)) { /* do Something */ } 
else { /* do something else */ }
Run Code Online (Sandbox Code Playgroud)

可写成

if(str instanceof String) { /* do Something else */ } 
else { /* do something */ }
Run Code Online (Sandbox Code Playgroud)

或者您可以编写代码,这样您就不需要知道它是否为String.例如

if(!(str instanceof String)) { str = str.toString(); } 
Run Code Online (Sandbox Code Playgroud)

可写成

str = str.toString();
Run Code Online (Sandbox Code Playgroud)


Pab*_*afi 12

如果你可以使用静态导入,你的道德准则允许它们

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后...

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");
        }
    }    
}
Run Code Online (Sandbox Code Playgroud)

这只是一个流畅的界面练习,我从来没有在现实代码中使用它!
按照你的经典方式,它不会混淆任何阅读你的代码的人!


Pau*_*aul 6

如果你觉得它更容易理解,你可以使用 Java 8 做这样的事情:

public static final Predicate<Object> isInstanceOfTheClass = 
    objectToTest -> objectToTest instanceof TheClass;

public static final Predicate<Object> isNotInstanceOfTheClass = 
    isInstanceOfTheClass.negate(); // or objectToTest -> !(objectToTest instanceof TheClass)

if (isNotInstanceOfTheClass.test(myObject)) {
    // do something
}
Run Code Online (Sandbox Code Playgroud)