2014-01-08 131 views
0

问题是新手,但我不明白为什么在Java或其他OOL原始类型不能铸造。 我的意思是你为什么不能做:为什么原始类型不能被铸造?

int k = 1; 
    String t = (String) k; 

我知道基本类型不是类,但我想知道这个道理的核心。

+0

取决于你正在铸造。告诉我们你的意思。 –

+1

你*可以*投射原始类型。例如:'int i = 42;长我=(长)我;(这甚至可以是隐含的)。如果你意识到它会产生这种效果,你也可以低头:'long l = 42; int i =(int)l;' –

+0

我不知道。当然,我猜你不能穿越这样的原始类型...... –

回答

2

的铸造不转换所述内容在存储器中。它只是改变了如何访问内容的观点。 1字节的int如何呈现2字节的字符串“32”没有任何有效的方法。

你当然也可以投1层字节的原语,但我想这不是你所期望的:

@Test 
public void castTests() { 
    assertEquals('7', (char) 55); 
    assertEquals(55, (int) '7'); 
} 

演员阵容不会改变内存中的内容。所以你的int 55变成了字节55的字符串表示,即“7”。

3

您总是可以(更隐含地)将更窄的基元类型投射到更宽的基元类型。这被称为拓宽原始转换。例如:

int i = 10; 
long l = i; 

而且您可以将更宽的基元类型直接投射到更窄的基元类型。这被称为缩小原始转换。在这种情况下,您告诉编译器,您知道自己在做什么,因为缩小的原始转换可能会丢失有关数值整体大小的信息,并且可能会丢失精度和范围。

long l = 10; 
int i = (int)l; 

documentation here.

1

这里是Java variable conversions including casting的文档。

您可能会发现这个discussion on Java casting更容易理解。

只要您使用转换运算符或表达式,并且Java的规则允许特定的变量类型转换,那么您可以投射原始类型。不过,您需要遵循转换规则。

但我不确定其他面向对象的语言,但是在C++中,如果你想使用C风格转换去那里,你可以做各种令人讨厌的转换。因为你最终会陷入一个受到伤害的世界,因为编译器会检查转换,所以使用C++风格转换比C风格转换更受欢迎。

1

您可以在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