Java 中不同类型的引用对象有什么不同吗?

Are reference objects with different types any different in Java?

当说:

  String str = "hello";
  Object obj = str;
  System.out.println(str==obj);

结果为真,因为它指向内存中相同的对象,这是有道理的。但是如果我说:

obj.indexOf("h");

或任何子类方法,我得到 "cannot find symbol"。它们仍然指向同一个对象,那么在编译期间发生了什么使不同类型的引用对象彼此不同?

Object 类型引用只知道属于其 public 接口的方法。

如果您知道 Object 引用是 String 类型,则必须进行转换:

int index = ((String) obj).indexOf("h");

苹果和梨。

身份检查 == 在运行时执行。有效且良好。

构造 obj.indexOf... 是一个 编译时错误 因为 class 对象只是没有方法 indexOf

如果你告诉编译器(通过转换的方式)obj 包含一个字符串,你可以获得有效代码

((String)obj).indexOf("h");

将再次编译