在Java中扩展后变窄

时间:2013-02-20 12:14:45

标签: java

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

Object o = "Hello World"

现在我们无法在String上使用任何o方法。我的问题是,由于这种类型转换会导致数据丢失,例如在C ++中,如果我们将float转换为int,数据就会丢失。

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

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

4 个答案:

答案 0 :(得分:4)

对于对象,您只需要转换引用。对象(String)仍然保持不变。

当您将String传递给方法调用时,您只是将引用传递给它(就像遇到返回值时一样)。您可以使用

进行检查和重铸
if (o instanceof String) {
   String s = (String)o;
}

并安全地使用该字符串(请注意,如果您执行此操作很多,则可能指向不正确的对象建模,但这是另一个问题)

请注意,您还要讨论浮点数/整数,这些与上面不同,因为它们是Java 原语,而不是引用。有关投射基元的讨论,请参阅here。简而言之,您将丢失数据。

答案 1 :(得分:2)

如果你有一个返回Object类对象的方法,你可以返回string和infact,你可以返回任何Java对象。没有任何目的,简单的转换会影响性能(更多是由于String的不变性)。事实上,在没有转换为Object的情况下,您可以创建Object类的方法。如果您想了解更多不可变性影响,可以参考Introduction – Immutable Nature – Comparison

答案 2 :(得分: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,那么测试是一种很好的做法。

答案 3 :(得分:1)

  

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

没有。这不会执行扩展,它会执行强制转换

  

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

没有。无论upcast如何,Object仍然是一个String。它可以在任何时候向下转换回到String。

缩小和扩展是根据原始和参考转换定义的 向上转发和向下转换(如您所使用的那样)是根据识别转换进行定义的。