接口和类的'instanceof'运算符的行为不同

阿杰·沙玛(Ajay Sharma):

我想知道有关instanceofJava 运算符的以下行为

interface C {}

class B {}

public class A {
    public static void main(String args[]) {
        B obj = new B();
        System.out.println(obj instanceof A);      //Gives compiler error
        System.out.println(obj instanceof C);      //Gives false as output
    }
}

为什么会这样呢?interface C之间没有关系class B,但是它给出false,而如果obj instanceof A给出编译器错误?

塔吉尔·瓦列夫(Tagir Valeev):

由于Java没有多重类继承,因此在编译期间绝对知道objtype的对象B不能是的子类型A另一方面,它可能是interface的子类型C,例如在这种情况下:

interface C {}

class B {}

class D extends B implements C {}

public class A {
    public static void main(String args[]) {
        B obj = new D();
        System.out.println(obj instanceof C);      //compiles and gives true as output  
    }
}

因此,仅查看obj instanceof C表达式编译器无法预先知道它是对还是假,但查看obj instanceof A它知道这始终是假的,因此毫无意义,可帮助您防止错误。如果您仍然想在程序中进行无意义的检查,则可以在上添加显式强制转换Object

System.out.println(((Object)obj) instanceof A);      //compiles fine

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Java中的instanceof运算符,用于比较不同的类

原始类型和包装类型数组的instanceof运算符

CString运算符“ + =”和“ +”之间的不同行为

如何将instanceof运算符用于带有类的片段

C#Null合并运算符与Null和Empty集合之间的OR运算符的行为不同

什么时候使用Class.isInstance()和什么时候使用instanceof运算符?

Powershell:类运算符的神秘行为

Or 的奇怪行为 | 运算符和非

Java isInstance与instanceOf运算符

使用std :: experimental :: is_detected_v检测免费的'=='运算符:std类的行为不同

在Java字符串比较中,==运算符和hashcode()方法的行为方式不同

Java-if-else和三元运算符之间的不同行为

猴子修补运算符重载在Python2和Python3中的行为不同

比较字符串和空格时,“ is”运算符的行为有所不同

可空布尔逻辑“ AND”运算符在true和false上的行为不同

pandas.Series运算符/ =在Python 2和Python 3中的不同行为

具有虚拟和非虚拟析构函数的删除运算符的不同行为

对于负整数,为什么C和Ruby之间的模运算符(%)的行为不同?

使用instanceof运算符可以实现两个并行的函数和参数的层次结构吗?

了解'| '和'&'运算符行为(R的逻辑运算符)

重载运算符删除而不重载new时正确的行为是什么?gcc和clang不同

为什么空条件运算符对于==和.Equals()的行为会有所不同?

为什么使用交叉元运算符时** 2和²的行为会有所不同?

具有接口的通用协方差-“ is”和“ =”运算符之间的怪异行为矛盾

接口和地址运算符

Python __getitem__和in运算符导致奇怪的行为

Python中递增和递减运算符的行为

增量运算符和“不确定行为”

双管道运算符和python virtualenv的奇怪行为