【问题标题】:How does below Java code work? Is it a kind of the implicit type conversion?下面的 Java 代码是如何工作的?它是一种隐式类型转换吗?
【发布时间】:2016-12-17 09:19:20
【问题描述】:

我在一个项目中看到了以下 Java 代码:

SimpleDateFormat dtFormater = new SimpleDateFormat("EEE, MMM dd");
long dt = weatherDataPerDay.getLong(JSON_KEY_DATETIME);
String result = dtFormater.format(dt * 1000).toString();

首先,上面的代码有效。我检查了 SimpleDateFormat 及其所有前辈的定义,但没有找到像format(long time) 这样的方法。

我只有 2 个接受 1 个参数的方法。他们是

  • format(Object object)
  • format(Date date)。

据我所知,Java只支持数值数据类型之间的隐式类型转换,并且只支持从小数据类型到大数据类型。

所以我无法解释为什么上面的代码有效。

【问题讨论】:

  • 非常感谢,@pvg!!!所以路径很长 -->(Boxing) Long -->(is-a) Object --> format(Object object)。对吗?
  • 是的,但请记住 format 是一个非常时髦的 api - 您使用的特定类实际上只接受 Number 和 Date 的子类。这些由实现在运行时检查。
  • @pvg 明白了!再次感谢!

标签: java types casting


【解决方案1】:

正如您已经注意到的,SimpleDateFormat 类有两个方法format:format(Object object) 和format(Date date)。这里dt 是long,dt * 1000 也将是long,感谢autoboxing,它将自动转换为包装类Long 的实例,这样它最终会调用@ 987654332@ 使用我们的 Long 实例作为参数。

方法format(Object object) 将在后台调用DateFormat#format(Object obj, StringBuffer toAppendTo, FieldPosition fieldPosition),它只接受javadoc 中所述的Number 或Date 作为参数obj 的类型,否则抛出IllegalArgumentException。

当参数obj 是Number 类型时,Long 是Number 的子类,它会自动创建一个带有new Date(((Number)obj).longValue()) 的新Date 实例,这意味着除了 Number 之外,它是自 1970 年 1 月 1 日 00:00:00 GMT 以来的总毫秒数。

【讨论】:

    【解决方案2】:

    考虑这个程序:

    public class A {
      public static void f(Object o) {
        System.out.println(o.getClass().getName());
      }
    
      public static void main(String[] args) {
        f(1);
      }
    }
    

    输出为java.lang.Integer。编译器看到您将原始值传递给接收对象的方法。因此,它将原始类型“装箱”到其对象计数器部分,因此 int 变为Integer。由于Integer 是Object,所以可以愉快地将新实例传递给方法。

    【讨论】:

      猜你喜欢
      • 2021-02-24
      • 1970-01-01
      • 2020-11-07
      • 1970-01-01
      • 2023-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多