繁体   English   中英

Java类有两个具有相同函数签名但返回类型不同的方法

[英]Java class has 2 methods with the same function signature but different return types

AFAIK不可能有一个具有相同呼叫签名的方法。 然而:

$ javap -public java.time.LocalTime  | grep "minus" | grep "Temporal" | grep -v "long"
    public java.time.LocalTime minus(java.time.temporal.TemporalAmount);
    public java.time.temporal.Temporal minus(java.time.temporal.TemporalAmount);

这些清楚地显示了具有相同呼叫签名的多种方法。

  1. Java如何解析函数调用?
  2. 为什么有多种功能?

编辑:通过仅保留相关位简化问题。

这是由于Java如何实现协变返回类型。 java.time.LocalTime有一个带签名的minus方法

LocalTime minus(TemporalAmount amountToSubtract)

但是这个方法实现了java.time.temporal.Temporal的签名接口方法

Temporal minus(TemporalAmount amount)

由于协变返回类型,这是允许的,但由于方法查找的工作方式,在运行时查找返回Temporal的方法将找不到返回LocalTime的方法。 因此,编译器创建一个具有相同签名的普通禁止方法,但返回Temporal 此方法调用返回LocalTime的版本。 在运行时,想要Temporal返回类型的调用找到桥接方法,一切都解决了。

这种桥接方法通常是不可见的,但它出现在javap输出中,导致您当前的混淆。

资料来源: http//www.artima.com/weblogs/viewpost.jsp? thread = 354443

这是来自StringBuilder一个桥接方法的javap -c反汇编,显示了它如何使用相同的签名调用该方法,但更具体的返回类型:

  public java.lang.Appendable append(java.lang.CharSequence) throws java.io.IOException;
    Code:
       0: aload_0       
       1: aload_1       
       2: invokevirtual #6                  // Method append:(Ljava/lang/CharSequence;)Ljava/lang/StringBuilder;
       5: areturn       

Java禁止在具有相同名称和签名的同一类或接口中使用两种方法

但是,两个不同的类,接口或枚举可以具有相同的方法签名; 例如,这是有效的:

public java.time.LocalTime minus(long, java.time.temporal.TemporalUnit);
public java.time.temporal.Temporal minus(long, java.time.temporal.TemporalUnit);

一个minus属于LocalTime类,另一个属于Temporal接口。 由于LocalTime实现Temporal ,因此必须在这两者之间存在签名匹配,否则合同将不会完成,这将导致编译错误。

Temporal是由LocalTime实现的接口,因此如果要检查尝试,它们的方法具有相同的签名

javap java.time.LocalTime

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM