3

假设我有一个String对象引用并将其分配给一个Object引用。这将隐式执行widening

Object o = "Hello World"

现在我们不能Stringo. 我的问题是,由于这种类型转换,是否会丢失任何数据,就像在 C++ 中,如果我们将 afloat转换为int.

如果我明确地o回退,String我将能够访问实际的String.

Java中有很多方法都有Object类型变量作为参数。所以我可以将任何类型的对象引用传递给这个参数。我可以通过显式缩小它来将此对象转换回原始对象吗?

4

4 回答 4

4

对于对象,您只是在转换引用。对象 ( String) 仍然完好无损。

当您将 a 传递String给方法调用时,您只是将引用传递给它(当您遇到返回值时会发生这种情况)。您可以使用

if (o instanceof String) {
   String s = (String)o;
}

并安全地使用该字符串(请注意,如果您经常这样做,它可能指向不正确的对象建模,但这是另一个问题)

请注意,您还讨论了浮点数/整数,它们与上述不同,因为它们是 Java原语,而不是引用。有关转换原语的讨论,请参见此处。简而言之,您将在此处丢失数据。

于 2013-02-20T12:15:54.260 回答
2

如果你有一个返回 Object 类对象的方法,你可以返回字符串,事实上,你可以返回任何 Java 对象。没有任何目的,简单的强制转换会影响性能(更多是由于字符串的不变性)。事实上,无需转换为 Object,您也可以使用 Object 类的方法。如果您想了解更多关于不变性的影响,可以参考Introduction – Immutable Nature – Comparison

于 2013-02-20T12:24:09.173 回答
1

如果你确定你有一个String对象,你可以。但你甚至可以在运行时测试它:

Object o = "Hello there!";
if (o instanceof String) {
    String s = (String) o;
    System.out.println("String length: " + s.length());
} else {
    System.out.println("Something else: " + o.getClass().getName());
}

实际上,如果您不想要意外ClassCastException的 s,测试是一种很好的做法。

于 2013-02-20T12:20:53.120 回答
1

假设我有一个 String 对象引用并将其分配给一个 Object 引用。这将隐式执行加宽

不,这不执行加宽,它执行铸造

由于这种类型转换,是否会丢失任何数据

不。不管向上转换,对象仍然是一个字符串。它可以在任何时候向下转换回字符串。

Narrowing 和 Widening 是针对原始和参考转换定义的。
Upcasting 和 Downcasting(正如你所使用的那样)是根据识别转换来定义的。

于 2013-02-20T12:23:32.803 回答