【发布时间】:2017-06-17 19:50:26
【问题描述】:
虽然与这个话题相关的问题很多,但不知怎的,我总觉得有些东西我不知道或者说我对这些答案不满意,所以我在这里再次发布
Integer in=new Integer(4);
Character character=(Character) in; //Cannot cast from Integer to Character
String s="hello";
int j=(int) s;//Cannot Cast from string to int
char chi='a';
int l=(int)chi; //works
int i=0;
char ch=(char)i; //works
String b=(String)1+"hello";//cannot cast from int to string
在第 2 行、第 4 行和第 9 行中,它向我显示了注释错误,而我可以在它被注释的行中进行 int 和 char 之间的转换。
所以在我发布的代码中,编译器检查静态/动态行为以及检查弱/强行为的位置。
我相信这些问题肯定有这么多的答案,所以如果有的话,贴出链接,否则详细的解释真的很可观。
什么让我感到困惑
- 静态/动态和强/弱在我看来是一样的
- 编译器如何理解何时检查静态/动态类型以及何时检查强/弱类型
- 这两种类型检查系统的必要性是什么。
【问题讨论】:
-
char和int都是数字原语,这就是为什么它起作用的原因,因为char在内部表示为一个无符号的 8 位数字,就像将 long 转换为 double -
实际上并没有两种类型的检查——只有一组固定的数字转换可能适用于某些情况。至于“编译器是如何知道的”——嗯,它知道是因为语言规范包含非常明确的规则:Chapter 5. Conversions and Contexts
-
@TaleevAalam 不,char、int、short、long、double、byte 都是数字原始类型所以你可以在两者之间进行转换他们
-
@1blustone Java 中的
char不是 8 位,而是 16 位。 -
@TaleevAalam 这对这个问题并不重要——他只是指出了1bluestone's comment中的一个错误
标签: java type-systems