2013-10-01 162 views
1

我想下面的代码将编印“否”为什么会出现在此的instanceof测试编译错误

class One{ 
public static void main(String[] args) { 

    One o = new One(); 
    if(o instanceof Two) { 
    System.out.println("Yes"); 
    } else { 
    System.out.println("No"); 
    } 
} 
} 

class Two { } 

但它扔我一个编译器错误,指出inconvertible types 应该不是instanceof运营商检查如果对象是在传承层次,如果是返回truefalse如果没有

编辑:

如果编译器已经知道某个条件永远无法真正的情况下,它抛出一个编译器错误,这是为什么代码编译

if(false) { 
    System.out.println("Yes"); 
} 
+2

因为它可以从类名中得知答案是错误的。声明o是一个对象(但仍然创建一个)。 'Object o = new One();' –

+0

@fvrgl:我没有看到那篇文章,我的不好。但你能看到我的编辑并提供解释吗? –

+0

您没有违反if(false)情况下的任何规则。 –

回答

0

instanceof用于标识由另一个类的引用变量多态引用的对象,因此如果引用变量o无法引用类Two的对象,它将不会编译。

所以这个:

One o = new One(); 
if(o instanceof Two) { 
    System.out.println("ok"); 
} 

为例的问题是类似这样的错误:

int i = 1; 
if (i == "s") { 
    System.out.println("ok"); 
} 

它不能编译了!

编辑

多态性的例子,其中它会使你的代码编译(按其他的答案):

Object o = new One(); 

因为o可以参考Two,所以instanceof会告诉你如果是的话。

4

您获得的消息,因为编译器能够告诉Ø不能是Two的实例,因为类OneTwo没有继承关系。

也许你的意思是写:

Object o = new One(); 

在这种情况下,你的测试才有意义。

+0

请参阅我编辑的问题 –

4

我相信这是因为你已经声明你的“o”变量是“One”类型的变量。 你的代码改成这样,它应该编译

Object o = new One(); 
    if(o instanceof Two) { 
    System.out.println("Yes"); 
    } else { 
    System.out.println("No"); 
    } 

instanceof运算符是为了使用,当你不知道事先的类型。所以当你有一个通过方法参数传入的东西的对象时,或者当你的变量被声明为一个基类的类型并且想要为每个子类类型有不同的行为时。在你提供的场景中,编译器可以在编译时告诉你,你写的东西永远不会是真的,并且这样做。

编辑:if(false)编译,因为有很多人使用这样的模式:

public class Application{ 

    private static final boolean DEBUG = true; 

    public static void main(String args[]){ 
     if(DEBUG){ 
      System.out.println("Debugging information"); 
     } 
    } 
} 

现在想象一下,其中在几个地方重复这种模式的大型应用程序。如果编译器拒绝编译这个,那么从切换到DEBUG模式将会困难得多。

在我之前的解释中,也许我不应该使用“编译器可以在编译时告诉你的话,你写的东西永远不会是真的”。更好的描述是“编译器可以告诉你所写的内容没有意义”。

+0

请参阅我编辑的问题 –

+0

我已编辑我的答案 – Moeri

-1

首先,对于上面的程序,你会得到“不兼容的条件操作数类型一个和两个”,因为一个和两个没有任何关系。

为了使上述的事实,就应该像计划的结果,

public class One { 
    public static void main(String[] args) { 

     One o = new Two(); 
     if (o instanceof Two) { 
      System.out.println("Yes"); 
     } else { 
      System.out.println("No"); 
     } 
    } 
} 

class Two extends One { 
} 

在这里,一个是父母和两个孩子是。父指向子对象,那么操作符的前一个实例将返回true。

+0

即时消息不是要打印“是” –

+0

正如我在评论中提到的,父母和孩子之间没有任何关系。对于使用instanceOf,引用类型和Object之间应该有一些关系。在这里,One和Two之间没有关系。 –

相关问题