【问题标题】:String to Object typecasting - Difference字符串到对象类型转换 - 区别
【发布时间】:2015-01-19 02:26:57
【问题描述】:

两者有什么区别。

public class Test {

    public static void main(String args[]) {
        String toBeCast = "cast this string";
        A a = toBeCast; // error - Type mismatch: cannot convert from String to A
        Object object = toBeCast;
    }
}


public class A {

}

当我们说每个对象都扩展 Object class 时,为什么 A a = toBeCast; 不允许,但是这个 Object object = toBeCast; 工作正常。

【问题讨论】:

  • 其他方式:为什么你认为String 对象应该可以转换为A?在你的代码中,你在哪里确保 A 是 String 的超类,以便编译器知道 A 应该能够做的所有事情都被 String 覆盖了?
  • 不,A 是 Object 的 子类,就像 String 是 Object 的子类一样。
  • 确实如此。这就是层次结构的工作方式。如果两个类在同一层次链中,则子类的实例可以安全地转换为超类的实例。在这种情况下,AString 非常不在同一个链中。
  • 转换对象引用不会改变对象的类型。事实上,它不会以任何方式改变对象。这与转换确实修改其格式和值的标量形成对比。
  • 原产国有句古话,类似于“狗有腿,不成桌子”

标签: java string casting downcast upcasting


【解决方案1】:

记住几何课上的那句老话——“每个正方形都是矩形,但不是每个矩形都是正方形”。将其概括为:“每个正方形/平行四边形/菱形都是多边形,但并非每个多边形都是正方形/平行四边形/菱形”。

这就是你正在做的事情:

String toBeCast = "cast this string" //this rhombus is a rhombus: cool!
A a = toBeCast; //this parallelogram is that rhombus : WTF? that doesn't make sense!  
Object object = toBeCast; //this polygon is that rhombus: cool! 

【讨论】:

  • LOL...喜欢 cmets 中的 WTF!
【解决方案2】:
  OBJECT
  /    \
  A    String

这就是您的类层次结构的样子,这就是为什么转换为 Object A 会出错。

【讨论】:

    【解决方案3】:

    变量 toBeCast 是字符串结构的一个实例。 变量 a 是类 A 的一个实例。

    可以编译如下:

    String toBeCast = "cast this string";
    Object obj = toBeCast;
    

    这是因为,正如您所说,对象的每个实例(包括字符串)都继承自 System.Object,但是以下内容将无法编译:

    A a = toBeCast;
    

    虽然 a (Type A) 继承自 System.Object,toBeCast (Type String) 继承自 Object,但 Type A 不继承自 Type String。

    因此编译器返回:“类型不匹配:无法从字符串转换为 A”。

    【讨论】:

      【解决方案4】:

      因为String 不是A 的子类

      【讨论】:

      • @drewmoore 我认为这个问题不应该被否决,这个疑问可能在很多人的脑海中......??我不知道是谁干的。
      【解决方案5】:

      查看对象窗口和对象螺钉。它们都是对象,但它们更像是一个对象。有更多的规格来描述两者,所以你知道什么是窗户或螺丝。编码语言 Java 中的对象也是如此。 从完全不同的环境中铸造类是没有意义的。

      String 也是 Final 且不可变的对象。请看一下 Why is String final in Java?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-07-03
        • 2011-10-02
        • 1970-01-01
        • 1970-01-01
        • 2019-05-28
        • 2014-09-17
        相关资源
        最近更新 更多