需要有关 Instanceof 运算符中类型转换的信息

Jok*_*ker 0 java instanceof

当我将字符串转换为对象时,以下instanceof运算符工作正常。

但是,如果没有类型转换,它就无法编译。

public class Test {
        public static void main(String[] args) {
            boolean b1 = "abc" instanceof Integer; // Compilation fails
            boolean b2 = ((Object) "abc") instanceof Integer; // Works fine
        }
    }
Run Code Online (Sandbox Code Playgroud)

我的问题是为什么编译器拒绝第一个b1但允许第二个b2

And*_*ner 5

因为您已转换"abc"Object,所以编译器会((Object) "abc")像对待任何其他类型的表达式一样对待Object

因此,它认为它可以包含任何Object(或空)。编译器不会深入检查表达式来确定更具体的类型。

你也可以写:

Object obj = "abc";
boolean b2 = obj instanceof Integer;
Run Code Online (Sandbox Code Playgroud)

基本上是一样的。

它会阻止你写作,"abc" instanceof Integer因为 和String都是Integer类,并且它们不相关,所以 aString永远不可能是 an 的实例Integer。(它允许"abc" instanceof List,因为List是一个接口,并且它不考虑类的最终性,并假设可能有一个String可以实现的子类List)。

从某种意义上说,强制转换就是告诉编译器你比它知道的更多。尽管编译器能够在非常基本的情况下进行反击,它可以确定您正在做一些无意义的事情,但它很大程度上会避开并信任您(以“随您的想法”的方式)。