C++或Java中的类型转换和类型转换有什么区别?

C++或Java中的类型转换和类型转换有什么区别?


答案 1

类型强制转换是将变量引用的值(内存块)视为与变量声明为的类型不同的类型。

类型转换实际上是执行该值的转换。

在许多语言中,一些转换(通常是数字转换)确实会导致转换(这将因语言而异),但大多数情况下只是“将此X视为Y”。

像人类语言的大多数方面一样,不幸的是,这些术语在不同社区的使用略有不同,主要是沿着语言路线。例如,请参阅下面James关于C++的评论——那里的“cast”这个词比上面的定义有更广泛的含义,后者更多地是在C或Java的模式中。为了让事情变得有趣,Java语言规范实际上进入了各种转换,包括转换转换。但以上是一个很好的经验法则。

但举一个简单的例子:

在Java中,在泛型之前,在处理映射时必须进行大量的类型转换并不罕见:

Map m = new HashMap();
m.put("one", "uno");

// This would give a compiler error, because although we know
// we'll get a String back, all the compiler knows is that it's
// an Object
String italian = m.get("one");

// This works, we're telling the compiler "trust me, it's a String"
String italian = (String)m.get("one");

幸运的是,添加泛型解决了这个问题,因为以这种方式进行铸造往往是一个具有维护问题的脆弱过程。

相比之下,如果您有一串数字,则需要进行转换

String s = "1234";

...并且需要知道这些数字以十进制表示的数字:

// Wrong (cast)
int n = (int)s;

// Right (conversion)
int n = Integer.parseInt(s, 10);

答案 2

也许一个例子可以提供帮助:

  • 如果转换为字符串,则得到 .33"!"
  • 如果转换为字符串,则得到 .33"33"

[注意:这个例子对数字和字符串的编码和内存中的表示做出了各种不一定有效的假设,但我希望机制是明确的。