null instanceof SomeClass
会返回false
而不是抛出NullPointerException
异常。
null instanceof SomeClass
会返回false
而不是抛出NullPointerException
异常。
instanceof
运算符的结果为true
。否则结果为false
。”使用空引用作为 instanceof
的第一个操作数将返回 false
。
!null
作为instanceof
的第一个操作数时,也会返回false
。很有趣! - MrYellow!null
是真值。 - MrYellow确实是一个非常好的问题。我刚刚为自己尝试了一下。
public class IsInstanceOfTest {
public static void main(final String[] args) {
String s;
s = "";
System.out.println((s instanceof String));
System.out.println(String.class.isInstance(s));
s = null;
System.out.println((s instanceof String));
System.out.println(String.class.isInstance(s));
}
}
打印
true
true
false
false
JLS / 15.20.2. Type Comparison Operator instanceof
运行时,如果RelationalExpression的值不为
null
且引用可以强制转换为ReferenceType而不会引发ClassCastException
,则instanceof
操作符的结果为true
。否则结果为false
。
API / Class#isInstance(Object)
如果此
Class
对象表示一个接口,则如果类或指定的Object
参数的任何超类实现了该接口,则此方法返回true
;否则返回false
。如果此Class
对象表示基本类型,则此方法返回false
。
s
只是一个对象引用变量。它可以引用一个实际存在的对象(""
),也可以引用一个(the)null
字面引用。 - Jin Kwonnull
都不是字符串数据。例如,s instanceof String
不等同于 field.getType().equals(String.class)
。 - Matthew Reads instanceof String
时,将s
替换为实际的值,那么就会变成 "" instanceof String
和 null instanceof String
。这样考虑可能更容易理解。 - Timo Türschmanninstanceof
将返回false
。作为一个小提示:
即使是 (
((A)null)
instanceof A)
也会返回 false
。
(如果将 null
进行类型转换看起来令人惊讶,有时候你也不得不这样做,比如在以下情况中:)
TBD
public class Test
{
public static void test(A a)
{
System.out.println("a instanceof A: " + (a instanceof A));
}
public static void test(B b) {
// Overloaded version. Would cause reference ambiguity (compile error)
// if Test.test(null) was called without casting.
// So you need to call Test.test((A)null) or Test.test((B)null).
}
}
那么Test.test((A)null)
将打印a instanceof A: false
。
P.S.:如果你在招聘人员,请不要将此作为面试问题。 :D
instanceof
之前进行null
检查。如果其值为null
,则始终返回false。instanceof
的说明:null
类型的东西,这个null类型在instanceof
运算符中进行了检查,显然会返回false,因为它期望一个特定的类型。还有一种特殊的空类型,表达式null的类型,它没有名称。由于null类型没有名称,因此无法声明null类型变量或将其转换为null类型。null引用是null类型表达式的唯一可能值。null引用始终可以扩展为任何引用类型。
从Java 14开始,特别是在LTS Java 17中,我们拥有了增强的instanceof
。我们有模式匹配功能,可以在类型比较后执行类型转换。
例如
public static void main(String[] args) {
Object testObject = "I am a string";
List<Object> testList = null;
if (testList instanceof List) {
System.out.println("instance of list");
} else {
System.out.println("null type");
}
//Enhanced instanceof with type conversion - tested with JDK 17
if (testObject instanceof String str) {
System.out.println(str.toUpperCase());
}
}
输出
null type
I AM A STRING
以下内容是null-safe的:
if(couldbenull instanceof Comparable comp){
return comp.compareTo(somethingElse);
}
//java < 14
if(couldbenull instanceof Comparable){
return ((Comparable)couldbenull).compareTo(somethingElse);
}
instanceof
运算符不需要显式的null
检查,因为如果操作数是null
,它不会抛出NullPointerException
。null
并且引用可以转换为引用类型而不引发类转换异常,则instanceof
运算符的结果为true。null
,则instanceof
运算符返回false
,因此不需要进行显式的null检查。public static void main(String[] args) {
if(lista != null && lista instanceof ArrayList) { //Violation
System.out.println("In if block");
}
else {
System.out.println("In else block");
}
}
instanceof
的正确使用方法如下所示:public static void main(String[] args) {
if(lista instanceof ArrayList){ //Correct way
System.out.println("In if block");
}
else {
System.out.println("In else block");
}
}
instanceof
检查null
的事实来实现一个非常紧凑的Javaequals()
实现,它比我看到由Eclipse和IntelliJ自动生成的实现更清晰易读:https://stackoverflow.com/a/75402885/501113 - chaotic3quilibrium