2017-12-02 108 views
1
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值。而是它给运行时错误?

请帮我从解决这个

回答

1

答:Can the char type be categorized as an integer?

是,一个char是所有在它出现的流行语言整型。 “积分”意味着它的频谱是离散的,任何两个不同值之间的最小差值是1.与其他积分类型相比,所需的支持值范围通常很小。计算机硬件传统上将整数视为基本数据类型;相比之下,算术浮点类型是更新和更复杂的加法。

希望这个解释可以帮助你了解多一点关于基本类型

+0

你是对的,但如果我们做这个赋值,char c = 1000,它会给出编译错误。那么我们如何证明上述逻辑? –

+0

编译错误?我不这么认为。 – Ele

+0

对不起,我打算说运行时错误,因为我们试图分配不兼容的类型,第二个片段得到运行时错误。 –

4

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.formatc转换有效参数。

参见the documentation

字符 - 可以被施加到其代表的Unicode字符基本类型:字符,字符,字节,字节,短,且短。这种转换也可以应用于字符时的int和Integer类型。isValidCodePoint(int)返回true

+0

好的,对于第二个片段,上面的解释是正确的。但是对于第一个片段,整数是如何分配给char的,不应该导致运行时错误。 –

+0

更新了答案。 –

+0

请注意,像[Google的错误倾向](http://errorprone.info/bugpattern/FormatString)之类的静态分析工具会检查无效的格式字符串。 –

0

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非法将在运行时抛出。

0

你可能想看看有关人士透露,具体为:

java.util.Formatter.format(Locale l, String format, Object ... args) 

你能想到的String.format(它调用Formatter.format)作为一个小的框架,从而根据Objects s到在format字符串编码指令