Groovy “instanceof”和“in”关键字之间有什么区别?

Groovy “instanceof”和“in”关键字之间有什么区别?,groovy,types,instanceof,Groovy,Types,Instanceof,为了验证类成员身份,in和instanceof关键字的行为似乎相同。那么这两者之间有什么区别呢?有什么区别吗?有几个关于StackOverflow的问题,或者这两个关键字都是为了解决这个问题而给出的,但是没有提到这两个关键字之间的区别,或者何时使用一个关键字比使用另一个关键字更合适。此外,官方文档提到了这一点,但没有详细说明instanceof关键字的作用 这两个关键字在类继承和接口实现方面表现相同: class MyMap extends LinkedHashMap { } def foo

为了验证类成员身份,in和instanceof关键字的行为似乎相同。那么这两者之间有什么区别呢?有什么区别吗?有几个关于StackOverflow的问题,或者这两个关键字都是为了解决这个问题而给出的,但是没有提到这两个关键字之间的区别,或者何时使用一个关键字比使用另一个关键字更合适。此外,官方文档提到了这一点,但没有详细说明instanceof关键字的作用

这两个关键字在类继承和接口实现方面表现相同:

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中的某个对象不同的行为。根据给出的信息,似乎在所有实际应用中,这两个对象的行为都是相同的,即使它们不是严格等价的。类的对象实例->真。