【问题标题】:Why primitive types can not be casted? [duplicate]为什么不能转换原始类型? [复制]
【发布时间】:2014-01-26 15:11:07
【问题描述】:

问题是新手,但我不明白为什么不能转换 Java 或其他 OOL 中的原始类型。 我的意思是为什么你不能这样做:

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

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

【问题讨论】:

  • 取决于您要投射的内容。告诉我们你的意思。
  • 您可以转换原始类型。示例:int i = 42; long l = (long)i;(甚至可以是隐含的)。你也可以低调,只要你意识到它会产生的效果:long l = 42; int i = (int)l;
  • 我不知道。当然我猜你不能像那样交叉转换原始类型......

标签: java types casting


【解决方案1】:

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

int i = 10;
long l = i;

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

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

见documentation here.

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        强制转换不会转换内存中的内容。它只是改变视图如何访问内容。 1 字节的 int 如何呈现 2 字节的字符串“32”没有有效的方法。

        你当然可以转换 1 字节原语,但我猜这不是你所期望的:

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

        演员表不会改变内存中的内容。因此,您的 int 55 成为字节 55 的字符串表示形式,即“7”。

        【讨论】:

          猜你喜欢
          • 2023-03-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-03
          • 2013-01-06
          • 2011-02-13
          • 1970-01-01
          • 2011-02-17
          相关资源
          最近更新 更多