当前位置: 首页 > 面试题库 >

协变量参数类型如何在Java中工作

乐正浩宕
2023-03-14
问题内容

给定Date有一个名为“ after(Date)”的方法,而Timestamp有一个名为“
after(Timestamp)”的方法,为什么在以下代码中调用Date中的 after 方法?

至于意外结果有人问在这里。

    java.sql.Timestamp one = new java.sql.Timestamp(1266873627200L);
    java.sql.Timestamp two = new java.sql.Timestamp(1266873627000L);

    java.util.Date oneDate = (java.util.Date) one;
    java.util.Date twoDate = (java.util.Date) two;


    System.out.println("one: " + oneDate.getTime());
    System.out.println("two: " + twoDate.getTime());

    if (oneDate.after(twoDate)) {
        System.out.println(oneDate.getTime() + " after " + twoDate.getTime());
    } else {
        System.out.println(oneDate.getTime() + " not after " + twoDate.getTime());
    }

结果

one: 1266873627200
two: 1266873627000
1266873627200 not after 1266873627000

问题答案:

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

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

如果你打电话one.after(two),然后 会用Timestamp.after(Timestamp)

Date.after(Date)仅考虑毫秒-但Timestamp仅将整数秒传递给的构造函数Date,因此即使您将不同的值传递给构造函数oneDatetwoDate也具有相等的毫秒值Date

值得在文档中Timestamp注意这一点:

由于上述Timestamp类和java.util.Date类之间的差异,建议代码不要以java.util.Date的实例的形式一般性地查看Timestamp值。Timestamp和java.util.Date之间的继承关系实际上表示实现继承,而不是类型继承。

老实说,听起来我对继承的使用非常差-但是Java有很多这样的:(



 类似资料:
  • 问题内容: 我了解协方差和逆方差。但是有一件小事我无法理解。在Coursera的“ Scala中的函数式编程”课程中,Martin Ordersky提到: 函数的参数类型是互变的,而返回类型是协变的 因此,例如在Java中,让extends出现。并让一个函数为: 我有函数调用为 所以基本上就是这样。根据Wiki,协方差是“从宽到窄转换”。在上面,我们正在从狗变成动物。所以论点类型不是协变而是协变吗

  • 问题内容: 假设我有一个协议: 这是实现 我的期望是我必须能够使用变量来打印这样的值: 编译器抱怨此错误: “协议’Printable’只能用作一般约束,因为它具有Self或关联的类型要求” 难道我做错了什么 ?有任何解决这个问题的方法吗 ? 编辑2:我想要的真实世界的例子。请注意,这不会编译,但是会介绍我想要实现的目标。 问题答案: 正如Thomas所指出的,您可以通过根本不提供类型来声明变量(

  • 问题内容: 在Java中,协方差允许API设计人员指定实例可以概括为某种类型或该类型的子类型中的任何一种。例如: 相反,则相反。它允许我们指定实例可以被概括为某种类型或超类型。 Java泛型的矛盾性如何有用?您何时选择使用它? 问题答案: 好吧,您的第二个示例将允许您编写: 而您无法使用第一种形式执行此操作。它不会像协方差那样有用,我将授予您。 在比较方面,它 可能 是有用的一个领域。例如,考虑:

  • 本文向大家介绍Java中的协变返回类型,包括了Java中的协变返回类型的使用技巧和注意事项,需要的朋友参考一下 协变返回类型是指重写方法的返回类型。它允许缩小重写方法的返回类型,而无需强制转换类型或检查返回类型。协变返回类型仅适用于非原始返回类型。 从Java 5开始,仅通过遵守返回类型是重写的方法返回类型的子类的条件,就可以通过更改其返回类型来覆盖方法。 示例 以下示例展示了相同的内容。 输出结

  • 局部变量 仅在代码块或函数中才可见的变量(参考函数章节的局部变量部分)。 环境变量 会影响用户及shell行为的变量。 一般情况下,每一个进程都有自己的“环境”(environment),也就是一组该进程可以访问到的变量。从这个意义上来说,shell表现出与其他进程一样的行为。 每当shell启动时,都会创建出与其环境对应的shell环境变量。改变或增加shell环境变量会使shell更新其自身的

  • 不同于许多其他编程语言,Bash 并不区分变量的类型。本质上说,Bash 变量是字符串,但在某些情况下,Bash 允许对变量进行算术运算和比较。决定因素则是变量值是否只含有数字。 样例 4-4. 整数还是字符串? #!/bin/bash # int-or-string.sh a=2334 # 整数。 let "a += 1" echo "a = $a "