下面的Java代码是如何工作的?这是一种隐式类型转换吗?

下面的Java代码是如何工作的?这是一种隐式类型转换吗?,java,types,casting,Java,Types,Casting,我在一个项目中看到了以下Java代码: SimpleDateFormat dtFormater = new SimpleDateFormat("EEE, MMM dd"); long dt = weatherDataPerDay.getLong(JSON_KEY_DATETIME); String result = dtFormater.format(dt * 1000).toString(); 首先,上述代码有效。我检查了SimpleDataFormat及其所有前身的定义,但没有找到像for

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

SimpleDateFormat dtFormater = new SimpleDateFormat("EEE, MMM dd");
long dt = weatherDataPerDay.getLong(JSON_KEY_DATETIME);
String result = dtFormater.format(dt * 1000).toString();
首先,上述代码有效。我检查了SimpleDataFormat及其所有前身的定义,但没有找到像
format(long time)
这样的方法

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

  • 格式(对象)
  • 格式(日期)
据我所知,Java只支持数字数据类型之间的隐式类型转换,只支持从小数据类型到大数据类型的转换

因此,我无法解释上述代码的工作原理。

请考虑以下程序:

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
是一个
对象
,新实例可以愉快地传递给该方法。

正如您已经注意到的,类
SimpleDateFormat
有两个方法
格式
格式(对象对象)
格式(日期)
。由于
dt
是一个
long
dt*1000
也将是一个
long
,并且由于,它将自动转换为包装类
long
的一个实例,这样它将最终以
long
实例作为参数调用
格式(对象对象)

方法
format(Object Object)
将在场景后调用,该方法只接受javadoc中所述的a
Number
或a
Date
作为参数类型
obj
,否则将抛出一个
IllegalArgumentException


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

非常感谢,@pvg!!!因此路径是长-->(装箱)长-->(is-a)对象-->格式(对象对象)。是吗?是的,但请记住格式是一个非常时髦的api-您使用的特定类实际上只接受Number和Date的子类。这些在运行时由实现检查。@pvg-gotcha!再次感谢!