Java中加宽后变窄

Java中加宽后变窄,java,Java,假设我有一个字符串对象引用,并将其分配给对象引用。这将隐式执行加宽 Object o = "Hello World" 现在我们不能在o上使用任何String方法。我的问题是,因为这种类型化,数据是否会丢失,如C++中,如果我们将浮点< /代码>转换成 int ,数据将丢失。 如果我显式地将o转换回字符串,我将能够访问实际的字符串 Object o = "Hello World" Java中有很多方法都有Objecttype变量作为参数,所以我可以将任何类型的Object ref传递给这个参数

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

Object o = "Hello World"
现在我们不能在
o
上使用任何
String
方法。我的问题是,因为这种类型化,数据是否会丢失,如C++中,如果我们将<代码>浮点< /代码>转换成<代码> int <代码>,数据将丢失。 如果我显式地将
o
转换回
字符串
,我将能够访问实际的
字符串

Object o = "Hello World"

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

对于对象,您只需转换引用即可。对象(
字符串
)仍保持完整

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

if (o instanceof String) {
   String s = (String)o;
}
并安全地使用该字符串(请注意,如果您经常这样做,可能会指向错误的对象建模,但这是另一个问题)


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

如果您确定您有一个
字符串
对象,您可以。但您甚至可以在运行时对其进行测试:

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,那么测试是一种很好的做法

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

否。这不执行加宽,而是执行铸造

是否会因为这种类型转换而丢失数据

不可以。不管向上投影如何,对象仍然是字符串。它可以在任何点向下投射回字符串

缩小和扩大是根据原语和引用转换定义的。

向上转换和向下转换(正如您所使用的)是针对标识转换而定义的。

如果您有一个返回对象类对象的方法,您可以返回string和infact,您可以返回任何Java对象。在没有任何目的的情况下,简单的强制转换会影响性能(更重要的是由于字符串的不变性)。事实上,无需强制转换到对象,您就可以使用对象类的方法。如果您想了解更多的不变性影响,可以参考