假设我有一个String
对象引用,并将其分配给Object
引用。这会隐式执行widening
。
Object o = "Hello World"
现在我们无法在String
上使用任何o
方法。我的问题是,由于这种类型转换会导致数据丢失,例如在C ++中,如果我们将float
转换为int
,数据就会丢失。
如果我明确地将o
投回String
,我将能够访问实际的String
。
Java中有很多方法都有Object
类型变量作为参数。所以我可以将任何类型的对象引用传递给这个参数。我可以通过明确地缩小它来将此对象转换回原始对象吗?
答案 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。
缩小和扩展是根据原始和参考转换定义的 向上转发和向下转换(如您所使用的那样)是根据识别转换进行定义的。