问题是新手,但我不明白为什么在Java或其他OOL原始类型不能铸造。 我的意思是你为什么不能做:为什么原始类型不能被铸造?
int k = 1;
String t = (String) k;
我知道基本类型不是类,但我想知道这个道理的核心。
问题是新手,但我不明白为什么在Java或其他OOL原始类型不能铸造。 我的意思是你为什么不能做:为什么原始类型不能被铸造?
int k = 1;
String t = (String) k;
我知道基本类型不是类,但我想知道这个道理的核心。
的铸造不转换所述内容在存储器中。它只是改变了如何访问内容的观点。 1字节的int如何呈现2字节的字符串“32”没有任何有效的方法。
你当然也可以投1层字节的原语,但我想这不是你所期望的:
@Test
public void castTests() {
assertEquals('7', (char) 55);
assertEquals(55, (int) '7');
}
演员阵容不会改变内存中的内容。所以你的int 55变成了字节55的字符串表示,即“7”。
您总是可以(更隐含地)将更窄的基元类型投射到更宽的基元类型。这被称为拓宽原始转换。例如:
int i = 10;
long l = i;
而且您可以将更宽的基元类型直接投射到更窄的基元类型。这被称为缩小原始转换。在这种情况下,您告诉编译器,您知道自己在做什么,因为缩小的原始转换可能会丢失有关数值整体大小的信息,并且可能会丢失精度和范围。
long l = 10;
int i = (int)l;
这里是Java variable conversions including casting的文档。
您可能会发现这个discussion on Java casting更容易理解。
只要您使用转换运算符或表达式,并且Java的规则允许特定的变量类型转换,那么您可以投射原始类型。不过,您需要遵循转换规则。
但我不确定其他面向对象的语言,但是在C++中,如果你想使用C风格转换去那里,你可以做各种令人讨厌的转换。因为你最终会陷入一个受到伤害的世界,因为编译器会检查转换,所以使用C++风格转换比C风格转换更受欢迎。
您可以在java中投射原始类型。从更窄,更小的内存大小,类型到更大,更大的内存大小,类型都是隐含的。 示例:
int i= 0 ;
long j = i; // implicit cast from int to long
从较大类型到较小类型的投射是明确的。你告诉编译器通过在括号使用以下语法i = (int) j;
实施例指定更窄的类型从更广泛的类型强制转换为较窄的类型:
long j = 0;
int i = (int) j; // explicit cast from long to int
取决于你正在铸造。告诉我们你的意思。 –
你*可以*投射原始类型。例如:'int i = 42;长我=(长)我;(这甚至可以是隐含的)。如果你意识到它会产生这种效果,你也可以低头:'long l = 42; int i =(int)l;' –
我不知道。当然,我猜你不能穿越这样的原始类型...... –