2013-02-20 42 views
3

假设我有一个String对象引用,并将它分配给Object引用。这将隐式执行widening在Java中加宽后缩小

Object o = "Hello World" 

现在我们不能用在任何o方法String。我的问题是,由于这种类型转换会导致数据丢失,就像在C++中那样,如果我们将float转换成int,数据将会丢失。

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

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

回答

4

对于物体,您只需简单地将参考。该对象(String)仍保持完好。

当您将String传递给方法调用时,您只需将引用传递给它(如遇到返回值时发生的那样)。您可以查看和使用

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

重铸,安全地使用该字符串(请注意,如果你做这个有很多,可能指向一个不正确的对象建模,但这是另一个问题)

请注意,您也谈论浮动/整数,这些都与上面不同,因为它们是Java 原语,而不是引用。有关铸造基元的讨论,请参阅here。简而言之,你会在这里丢失数据。

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秒。

1

假设我哈瓦字符串对象参考,我将其分配给一个 对象reference.This将隐式执行扩大

号此不进行加宽,它执行铸造

是否因为此类型转换而导致数据丢失

否。对象仍然是一个字符串,不管upcast如何。在任何时候都可以将downcast回到字符串。

缩小和加宽是针对原始和参考转换定义的。
向上转换和向下转换(就像您使用过的那样)是为了识别转换而定义的。

2

如果你有一个返回Object类对象的方法,你可以返回字符串和Infact,你可以返回任何Java对象。没有任何目的,简单地投射影响表现(更多由于字符串的不变性)。事实上,如果不将对象转换为对象,也可以使用Object类的方法。如果您想了解更多不变性影响,请参阅Introduction – Immutable Nature – Comparison