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

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

What is the difference between typecasting and typeconversion in C++ or Java ?

推荐答案

类型 casting 将变量引用的值(内存块)视为不同于声明变量的类型.

Type casting is treating a value (block of memory) referenced by a variable as being of a different type than the type the variable is declared as.

类型 conversion 实际上是在执行该值的转换.

Type conversion is actually performing a conversion of that value.

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

In many languages, some casts (usually numeric ones) do result in conversions (this will vary quite a bit by language), but mostly it's just "treat this X as a Y".

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

Like most aspects of human language, unfortunately the terms are used slightly differently in different communities, mostly along language lines. For instance, see James' comment below about C++ — the word "cast" there has a much broader meaning than the above definition, which is more in the C or Java mold. And just to make things fun, the Java Language Spec actually gets into various kinds of casts, including casting conversions. But the above is a good rule of thumb.

但举个简单的例子:

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

In Java, prior to generics it wasn't unusual to have to do a lot of typecasting when dealing with maps:

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");

幸运的是,添加 generics 解决了这个问题,因为以这种方式进行投射往往是一种存在维护问题的脆弱流程.

Fortunately, the addition of generics addressed this, as casting in this way tends to be a fragile process with maintenance issues.

相比之下,如果你有一个数字字符串,你会转换:

In contrast, you'd convert if you had a String of digits:

String s = "1234";

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

...and needed to know what number those digits represented in decimal:

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

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

相关文章