协变参数类型在java中是如何工作的

协变参数类型在java中是如何工作的,java,overloading,Java,Overloading,既然Date有一个名为“after(Date)”的方法,而Timestamp有一个覆盖它的名为“after(Timestamp)”的方法,为什么Date中的after方法在下面的代码中被调用 有人问了关于意外结果的问题 结果 one: 1266873627200 two: 1266873627000 1266873627200 not after 1266873627000 在编译时考虑重载;在执行时考虑覆盖 时间戳在之后重载,它不会覆盖现有方法-因此您的oneDate.after(twoDa

既然Date有一个名为“after(Date)”的方法,而Timestamp有一个覆盖它的名为“after(Timestamp)”的方法,为什么Date中的after方法在下面的代码中被调用

有人问了关于意外结果的问题

结果

one: 1266873627200
two: 1266873627000
1266873627200 not after 1266873627000

在编译时考虑重载;在执行时考虑覆盖

时间戳在
之后重载
,它不会覆盖现有方法-因此您的
oneDate.after(twoDate)
只考虑
java.util.Date中的方法;此外,即使使用
one.after(twoDate)
它仍然只会使用
after(Date)
,因为
twoDate
的编译时类型是
Date
而不是
时间戳

如果调用
one.after(two)
,则将使用
Timestamp.after(Timestamp)

Date.after(Date)
只考虑毫秒-但是
时间戳
只向
Date
的构造函数传递整数秒,因此
oneDate
twoDate
Date
中具有相等的毫秒值,即使您向构造函数传递了不同的值

但值得注意的是,这一点:

由于 Timestamp类和java.util.Date 上面提到的类,它是 建议不要查看代码 时间戳值通常作为 java.util.Date的实例。这个 遗传关系 时间戳和java.util.Date 表示实现继承, 而不是类型继承


老实说,对我来说,继承的使用听起来很糟糕,但是Java有很多这样的功能:(

Date中的after方法不比Nano。@s\t\u e\u v\u e:Ah-我有点误读了输出。
!x.after(y)
y.after(x)
-这就是您的输出所建议的。
one: 1266873627200
two: 1266873627000
1266873627200 not after 1266873627000