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

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

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

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


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

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

当前回答

我的观点是,使用一个is string方法

public static boolean isString(Object thing) {
    return thing instanceof String;
}

public void someMethod(Object thing){
    if (!isString(thing)) {
        return null;
    }
    log.debug("my thing is valid");
}

其他回答

如果你觉得它更容易理解,你可以在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
}

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

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

你可以通过以下方法来实现。只需通过添加括号if(!(condition with instanceOf))通过添加整个条件!操作符的开头,就像下面的代码片段中提到的那样。

if(!(str instanceof String)) { /* do Something */ } // COMPILATION WORK

而不是

if(str !instanceof String) { /* do Something */ } // COMPILATION FAIL

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

我同意在大多数情况下if (!(x instanceof Y)){…}是最好的方法,但在某些情况下,创建一个isY(x)函数,这样你可以if (!isY(x)){…是值得的。

我是一个打字新手,在过去的几周里,我已经遇到了很多次这个S/O问题,所以对于谷歌人来说,打字的方法是创建一个像这样的字体保护:

typeGuards.ts

export function isHTMLInputElement (value: any): value is HTMLInputElement {
  return value instanceof HTMLInputElement
}

使用

if (!isHTMLInputElement(x)) throw new RangeError()
// do something with an HTMLInputElement

我想这可能适用于typescript而不是常规js的唯一原因是类型保护是一种常见的惯例,所以如果你为其他接口编写它们,为类也编写它们是合理的/可以理解的/自然的。

在文档中有更多关于用户定义类型保护的细节