Groovy “instanceof”和“in”关键字之间有什么区别?
为了验证类成员身份,in和instanceof关键字的行为似乎相同。那么这两者之间有什么区别呢?有什么区别吗?有几个关于StackOverflow的问题,或者这两个关键字都是为了解决这个问题而给出的,但是没有提到这两个关键字之间的区别,或者何时使用一个关键字比使用另一个关键字更合适。此外,官方文档提到了这一点,但没有详细说明instanceof关键字的作用 这两个关键字在类继承和接口实现方面表现相同:Groovy “instanceof”和“in”关键字之间有什么区别?,groovy,types,instanceof,Groovy,Types,Instanceof,为了验证类成员身份,in和instanceof关键字的行为似乎相同。那么这两者之间有什么区别呢?有什么区别吗?有几个关于StackOverflow的问题,或者这两个关键字都是为了解决这个问题而给出的,但是没有提到这两个关键字之间的区别,或者何时使用一个关键字比使用另一个关键字更合适。此外,官方文档提到了这一点,但没有详细说明instanceof关键字的作用 这两个关键字在类继承和接口实现方面表现相同: class MyMap extends LinkedHashMap { } def foo
class MyMap extends LinkedHashMap { }
def foo = new LinkedHashMap()
def bar = new MyMap()
println("LinkedHashMap instance is 'in' LinkedHashMap: ${foo in LinkedHashMap}")
println("LinkedHashMap instance is 'instanceof' LinkedHashMap: ${foo instanceof LinkedHashMap}")
println("LinkedHashMap instance is 'in' Map: ${foo in Map}")
println("LinkedHashMap instance is 'instanceof' Map: ${foo instanceof Map}")
println("MyMap instance is 'in' LinkedHashMap: ${bar in LinkedHashMap}")
println("MyMap instance is 'instanceof' LinkedHashMap: ${bar instanceof LinkedHashMap}")
println("MyMap instance is 'in' Map: ${bar in Map}")
println("MyMap instance is 'instanceof' Map: ${bar instanceof Map}")
输出:
LinkedHashMap instance is 'in' LinkedHashMap: true
LinkedHashMap instance is 'instanceof' LinkedHashMap: true
LinkedHashMap instance is 'in' Map: true
LinkedHashMap instance is 'instanceof' Map: true
MyMap instance is 'in' LinkedHashMap: true
MyMap instance is 'instanceof' LinkedHashMap: true
MyMap instance is 'in' Map: true
MyMap instance is 'instanceof' Map: true
主要区别在于instanceof是一个Java关键字,而SomeClass中的obj是SomeClass.isCaseobj方法调用的等价物,正如您在问题中提到的 有一个主要含义:instanceof不能被覆盖,正如Oracle文档所说: instanceof运算符将对象与指定类型进行比较。您可以使用它来测试对象是类的实例、子类的实例还是实现特定接口的类的实例。 资料来源: Class.isCaseobj的实现如下:
/**
* Special 'Case' implementation for Class, which allows testing
* for a certain class in a switch statement.
* For example:
* <pre>switch( obj ) {
* case List :
* // obj is a list
* break;
* case Set :
* // etc
* }</pre>
*
* @param caseValue the case value
* @param switchValue the switch value
* @return true if the switchValue is deemed to be assignable from the given class
* @since 1.0
*/
public static boolean isCase(Class caseValue, Object switchValue) {
if (switchValue instanceof Class) {
Class val = (Class) switchValue;
return caseValue.isAssignableFrom(val);
}
return caseValue.isInstance(switchValue);
}
资料来源:
正如您在源代码中看到的,Groovy在SomeClass中的obj不是instanceof的别名,因为它做的更多。然而,有一件重要的事情值得一提——您可以覆盖isCase实现,但不能更改instanceof Java关键字的行为。如果您将Class.isCase用作Java的instanceof关键字的替代品,则重写Class.isCase可能会对代码造成一些损害。Wow,对源代码的回答非常透彻。谢谢我也很好奇,如果不重写isCase,SomeClass的某个对象实例是否会有与SomeClass中的某个对象不同的行为。根据给出的信息,似乎在所有实际应用中,这两个对象的行为都是相同的,即使它们不是严格等价的。类的对象实例->真。