为什么原始类型不能被铸造?

时间:2014-01-08 13:24:59

标签: java types casting

问题是新手,但我不明白为什么Java或其他OOL中的原始类型无法投放。 我的意思是你不能做的原因:

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

我知道原始类型不是类,但我想知道这个原因的核心。

4 个答案:

答案 0 :(得分:3)

您始终可以(隐式地)将较窄的基元类型转换为更宽的基元类型。这称为加宽基元转换。例如:

int i = 10;
long l = i;

您可以明确地将更宽的基元类型转换为更窄的基元类型。这称为缩小基元转换。在这种情况下,您告诉编译器您知道自己在做什么,因为缩小的基元转换可能会丢失有关数值整体大小的信息,也可能会丢失精度和范围。

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

请参阅documentation here.

答案 1 :(得分:2)

演员不会转换内存中的内容。它只是更改了如何访问内容的视图。 1字节int如何呈现2字节字符串" 32"没有有效的方法。

您当然可以投射1个字节的基元,但我猜它不是您所期望的:

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

演员不会改变记忆中的内容。所以你的int 55成为字节55的字符串表示,即" 7"。

答案 2 :(得分:1)

以下是Java variable conversions including casting的文档。

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

只要您使用强制转换运算符或表达式并且Java规则允许特定的变量类型转换,您就可以转换基本类型。但您确实需要遵循转换规则。

我不确定其他面向对象的语言,但是在C ++中,如果你想使用C样式转换,你可以做各种讨厌的转换。因为你最终可能会受到伤害,所以使用C ++样式转换比C样式转换更受欢迎,因为编译器会检查转换。

答案 3 :(得分: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