下面的Java代码是如何工作的?这是一种隐式类型转换吗?
我在一个项目中看到了以下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
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个参数的方法。他们是
格式(对象)
格式(日期)
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中所述的aNumber
或aDate
作为参数类型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!再次感谢!