2016-12-17 31 views
1

我看到一个项目的Java代码:以下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只支持数字数据类型之间的隐式类型转换,只能从小数据类型转换为大数据类型。

所以我不能解释为什么上面的代码工作。

+1

https://docs.oracle.com/javase/tutorial/java/data/autoboxing.html – pvg

+0

非常感谢,@ pvg !!!所以路径很长 - >(Boxing)Long - >(is-a)Object - > format(Object object)。对? –

+1

是的,但请记住格式是一个非常时髦的api - 您使用的特定类实际上只接受Number和Date的子类。这些在运行时由实现进行检查。 – pvg

回答

1

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

方法format(Object object)将调用场景DateFormat#format(Object obj, StringBuffer toAppendTo, FieldPosition fieldPosition)如所述进入的Javadoc一个NumberDate类型参数obj否则IllegalArgumentException被抛出的只接受后面。

而当参数objNumber类型,是这里作为Long的情况下,子类的Number的,它会自动与new Date(((Number)obj).longValue())这意味着它节选的Number是的总量创建一个新的Date实例毫秒以来1970年1月1日00:00:00 GMT

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。由于IntegerObject,新实例可以愉快地传递给该方法。

相关问题