我在想是否存在更好/更好的方法来否定Java中的instanceof
。
实际上,我正在做类似的事情:
if(!(str instanceof String)) { /* do Something */ }
但我认为应该存在一个“漂亮”的语法。
有谁知道它是否存在,以及语法是什么样的?
修改 美丽的,我可能会这样说:
if(str !instanceof String) { /* do Something */ } // compilation fails
答案 0 :(得分:277)
不,没有更好的方法;你的是规范的。
答案 1 :(得分:116)
当你说“美丽”时,我不知道你的想象,但是这个怎么样?我个人认为它比你发布的经典形式更糟糕,但是有人可能会喜欢它......
if (str instanceof String == false) { /* ... */ }
答案 2 :(得分:52)
您可以使用Class.isInstance
方法:
if(!String.class.isInstance(str)) { /* do Something */ }
......但它仍然被否定而且相当丑陋。
答案 3 :(得分:20)
通常,您不仅需要if
,还需要else
条款。
if(!(str instanceof String)) { /* do Something */ }
else { /* do something else */ }
可以写成
if(str instanceof String) { /* do Something else */ }
else { /* do something */ }
或者您可以编写代码,这样您就不需要知道它是否是String。 e.g。
if(!(str instanceof String)) { str = str.toString(); }
可以写成
str = str.toString();
答案 4 :(得分: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);
}
}
然后......
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");
}
}
}
这只是一个流畅的界面练习,我从未在现实代码中使用它!
按照你的经典方式,它不会让其他人在阅读你的代码时感到困惑!
答案 5 :(得分:3)
好吧,我的两分钱,使用一个字符串方法:
'getElementsByTagName' is undefined or null reference.
答案 6 :(得分:3)
如果您觉得它更容易理解,则可以使用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
}
答案 7 :(得分:1)
我同意,在大多数情况下,if (!(x instanceof Y)) {...}
是最好的方法,但是在某些情况下,创建isY(x)
函数以便您可以if (!isY(x)) {...}
是值得的。
我是一个打字稿新手,在过去的几周中,我多次碰到这个S / O问题,所以对于Google员工来说,打字稿的实现方法是创建一个这样的打字机: / p>
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的唯一原因是typeguard是一个通用约定,因此,如果您为其他接口编写它们,那么为类编写它们也是合理/可理解/自然的
有关诸如in the docs这样的用户定义类型防护的详细信息,
答案 8 :(得分:0)
您可以通过以下方式实现。.只需添加括号if(!(condition with instanceOf))
来添加条件,并在开始时添加!
运算符即可,就像下面的代码片段所述。 >
if(!(str instanceof String)) { /* do Something */ } // COMPILATION WORK
代替
if(str !instanceof String) { /* do Something */ } // COMPILATION FAIL