【问题标题】:Implicit conversion in JavaJava中的隐式转换
【发布时间】:2017-12-02 22:21:05
【问题描述】:
class A {
    public static void main(String args[]) {
        String.format("%c",2);
    }
}

上面的程序编译得很好,但是它如何将整数分配给char。它不应该给出有损转换编译错误吗?

class A {
    public static void main(String args[]) {
        String.format("%d",45.67);
    }
}

这不会导致编译错误,但它应该会导致编译错误,因为我们如何将双精度值分配给 int。而是给出运行时错误?

请帮我解决这个问题

【问题讨论】:

    标签: java


    【解决方案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 是cString.format 中转换的有效参数。

    the documentation:

    Character - 可应用于表示 Unicode 字符的基本类型:char、Character、byte、Byte、short 和 Short。当 Character.isValidCodePoint(int) 返回 true 时,这种转换也可以应用于 int 和 Integer 类型

    【讨论】:

    • 好的,对于第二个sn-p,上面的解释是正确的。但是对于第一个 sn-p 如何将整数分配给 char,不应该导致运行时错误。
    • 更新了答案。
    • 请注意,Google's Error Prone 等静态分析工具会检查无效的格式字符串。
    • char c=1 会很好,但 char c=65537 不会很好。另外 String.format("%c",65537) 很好。我没有得到这种模棱两可的行为
    【解决方案2】:

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

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

    希望这个解释能帮助您更多地了解原始类型

    【讨论】:

    • 你是对的,但如果我们进行赋值,char c=1000,它会给出一个编译错误。那么我们如何证明上述逻辑的合理性呢?
    • 对不起,我的意思是说运行时错误,因为第二个 sn-p 在我们试图分配不兼容的类型时出现运行时错误。
    • 您不会遇到运行时错误,因为对于 Java,char 的表示形式为 int,反之亦然,例如,Char 'a' 是 Integer 97。
    【解决方案3】:

    您可能想查看来源,具体来说:

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

    您可以将String.format(调用Formatter.format)视为一个小框架,用于根据format字符串中编码的指令格式化Objectss

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多