Java中的隐式转换
class A {
public static void main(String args[]) {
String.format("%c",2);
}
}
上面的程序编译正常,但它如何将整型赋值给char。它不应该给有损的转换编译错误?Java中的隐式转换
class A {
public static void main(String args[]) {
String.format("%d",45.67);
}
}
这不会导致编译错误,但它会导致编译错误,因为我们如何为int分配一个double值。而是它给运行时错误?
请帮我从解决这个
答:Can the char type be categorized as an integer?
是,一个char是所有在它出现的流行语言整型。 “积分”意味着它的频谱是离散的,任何两个不同值之间的最小差值是1.与其他积分类型相比,所需的支持值范围通常很小。计算机硬件传统上将整数视为基本数据类型;相比之下,算术浮点类型是更新和更复杂的加法。
希望这个解释可以帮助你了解多一点关于基本类型。
String.format
只是消耗String
实例作为第一个参数的标准方法。
Java不编译字符串文字的内容。开发人员有责任提供正确的模式。
的String.format
文件说:
抛出: java.util.IllegalFormatException - 如果格式字符串包含非法语法,格式说明符与给定参数不兼容,论据不足给出的格式字符串或其他非法条件。
更新#1
注:Java使用整数的字符表示。所以第一个例子不会失败。 下面的代码是有效的在Java中:
char c = 1;
int i = 'o';
更新#2
根据the documentationchar
有最小值0和65535包容性的最大值。这就是为什么你不能把65537分配给字符。 在另一方面65537是在String.format
c
转换有效参数。
字符 - 可以被施加到其代表的Unicode字符基本类型:字符,字符,字节,字节,短,且短。这种转换也可以应用于字符时的int和Integer类型。isValidCodePoint(int)返回true
好的,对于第二个片段,上面的解释是正确的。但是对于第一个片段,整数是如何分配给char的,不应该导致运行时错误。 –
更新了答案。 –
请注意,像[Google的错误倾向](http://errorprone.info/bugpattern/FormatString)之类的静态分析工具会检查无效的格式字符串。 –
format
的签名为公开static String format(String format, Object... args)
。所以这个方法在第一个参数之后会接受任何参数(它必须是String
)。 Java不会导致complile错误,因为它必须在运行时首先解析format
。例如,您可以通过传递true
作为参数来检查它。
String.format("%d", true); //still compiles
String.format("%d", new StringBuilder()); //also still compiles
如果参数是那么java.util.IllegalFormatException
非法将在运行时抛出。
你可能想看看有关人士透露,具体为:
java.util.Formatter.format(Locale l, String format, Object ... args)
你能想到的String.format
(它调用Formatter.format
)作为一个小的框架,从而根据Objects
s到在format
字符串编码指令
你是对的,但如果我们做这个赋值,char c = 1000,它会给出编译错误。那么我们如何证明上述逻辑? –
编译错误?我不这么认为。 – Ele
对不起,我打算说运行时错误,因为我们试图分配不兼容的类型,第二个片段得到运行时错误。 –