我在想在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 (!(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的唯一原因是类型保护是一种常见的惯例,所以如果你为其他接口编写它们,为类也编写它们是合理的/可以理解的/自然的。
在文档中有更多关于用户定义类型保护的细节