【问题标题】:Why compile time error on instanceof operator but works fine on casting [duplicate]为什么在 instanceof 运算符上编译时错误但在强制转换时工作正常 [重复]
【发布时间】:2017-03-06 10:17:25
【问题描述】:

我的问题是,既然new Test() 既不是String 的子类,也不是String 本身,那么为什么instanceof 编译失败?它不应该返回 false

    public class Test{
        public static void main(String[] args) {
       //Compiles fails
       System.out.println(new Test() instanceof String);
      //compiles fine but run time class cast exception.   
        Test = (Test) new Object();;
        }
    }

现在我已经编辑了我的帖子,所以这就是我真正想知道为什么会有这种差异的原因。为什么编译不会在强制转换时失败

【问题讨论】:

  • 编译器的信息是什么?
  • 编译器说-不兼容的条件操作数类型 TypeCasting 和 String
  • Object t=new Test(); if(t instanceof String ){ } 如果您说 new Test() instanceof String,那么您已经知道它不是字符串。 instanceof 工作,如果你不确定,对象是哪种类型
  • 但这就是运算符实例出现的原因,我知道但逻辑上它应该显示 false 作为结果而不是编译失败。
  • 它不重复请再次检查他们说为什么没有编译错误,我在这里寻求解释为什么有错误虽然它应该是错误的

标签: java instanceof


【解决方案1】:

instanceof如果在编译时保证总是返回false,则不能应用。

规则是,如果将第一个操作数转换为第二个操作数的类型总是会抛出 ClassCastException,编译器不允许在这些操作数上应用 instanceof 运算符。

Test 类的实例永远不会成为java.lang.String 的实例。

15.20.2. Type Comparison Operator instanceof

如果将 RelationalExpression 转换为 ReferenceType(第 15.16 节)作为编译时错误被拒绝,则 instanceof 关系表达式同样会产生编译时错误。 在这种情况下,instanceof 表达式的结果永远不会为真

【讨论】:

  • 我已经编辑了我的问题,请检查。
  • @ShowStopper 你必须考虑(String) new Test(),而不是(Test) new Object()
【解决方案2】:

编译器知道String的类型层次是Object>String,Test的层次是Object>Test,所以它永远不可能是真的。

【讨论】:

    猜你喜欢
    • 2014-11-05
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 2011-05-10
    • 2012-08-25
    • 1970-01-01
    • 1970-01-01
    • 2015-07-04
    相关资源
    最近更新 更多