2017-04-01 59 views
1
class A {} 

class B {} 

public class Demo { 

    public static void main(String[] args) { 

     A a = new A(); 
     System.out.println(a instanceof B); 
    } 

} 

此代码给出编译时错误。 如何使用instanceof在object不是指定类的实例时给出false而不是编译时错误。java中的运算符实例

+1

您是否在同一个文件中编译了'class A'和'class B'? –

+3

尝试用'Object a = new A();' – Pshemo

回答

4

Java知道A不能是B所以它不会编译。如果更改行

Object a = new A(); 

它会编译(并返回false),因为它不再能告诉我们,如果一个Object可以转换成B类型。

+0

我的意思是说如果对象是一个类的实例,那么它的真实性就是真,如果不是,则为false。但是当我尝试第二种情况时,它不是给虚假给编译时错误.......但由于定义说它有两个值true和false,并且如果object不是类的一个实例,所以如果得到错误,它会给出false。 – Ankit

+0

当您将它与不相关的类型一起使用时,它永远不会编译。 'instanceof'适用于有问题的对象可以合法地成为你正在测试的类型的情况。 'myBird instanceof Eagle' – hughjdavey

+2

@Ankit因为编译器知道根据类型A(与B无关)的规范变量不能容纳B的实例,所以这样的测试永远不会返回true,所以即使写入也没有意义它。编写这样的代码很可能基于不正确的假设,所以最好现在停止程序员而不是让他错误。 – Pshemo

1

您可以使用此:

System.out.println(a.getClass().equals(B.class)); 

相反的:

System.out.println(a instanceof B); 
+0

thanx ....这对我来说是新的 – Ankit

+0

这不是相同。例如,'“”.getClass()。equals(Object.class)'为false,但是''“instanceof Object'为true。 'instanceof'匹配子类,'equals'不匹配。 –

2

如果class AB通过继承是不相关的,那么当你尝试执行a instanceof B

编译器将抛出一个错误

就你而言,A不是B的子类,所以你可以“T做一个instanceof检查像a instanceof B

但是,如果你改变你的类象下面这样:

class A {} 

class B extends A {} 

public static void main(String[] args) { 
    B b=new B(); 
    System.out.println(b instanceof A); 
} 

现在b instanceof A将返回true因为B IS-A(类型)A

您可以阅读关于相同主题的Java doc here

instanceof运算符将对象与指定类型进行比较。您可以使用它来测试对象是否是类的实例,子类的实例 或者实现特定接口的类的实例。

+0

非常感谢你 – Ankit

0

引用JLS Sec 15.20.2

如果RelationalExpressionReferenceType的铸造(§15.16)将被拒绝作为一个编译时间错误,那么instanceof关系式同样产生一个编译时间错误。在这种情况下,instanceof表达式的结果永远不会成立。

(如果它们被描述RelationalExpression instanceof ReferenceType

你不能写B b = (B) a;要么,因为AB都是类(*),并且是不相关的,在这个意义上A直接或间接不扩展B,反之亦然。

因此,对A的引用永远不能包含B的实例,因此对此进行测试是无意义的。因此,编译器会阻止您对此进行测试,因为它可能表示出现逻辑错误。


(*),你可以写a instanceof B如果B是一个接口,因为a可能指的A子类,还实现了B,例如

class ChildOfA extends A implements B {} 
A a = new ChildOfA(); 
System.out.println(a instanceof B); // fine.