我想知道关于Java中instanceof
操作符的如下行为。
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
的情况下,它给出了编译器错误?
发布于 2015-07-14 13:49:50
因为Java没有多类继承,所以在编译过程中绝对知道B
类型的obj
对象不能是A
的子类型。另一方面,它可能是接口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
发布于 2017-11-19 00:26:41
通过在下面的类声明中使用final
修饰符,可以保证不会有Test
的子类,它可以实现接口Foobar
。在这种情况下,很明显Test
和Foobar
是不兼容的:
public final class Test {
public static void main(String[] args) {
Test test = new Test();
System.out.println(test instanceof Foobar); // Compiler error: incompatible types
}
}
interface Foobar {
}
否则,如果Test
未声明为final
,则可能由Test
的子类实现该接口。这就是为什么编译器在这种情况下会允许语句test instanceof Foobar
。
https://stackoverflow.com/questions/31398444
复制相似问题