java - Java 中的类型删除和重载 : Why does this work?

标签 java overloading type-erasure

我有以下代码:

public class Pair< T, U > {
    public T first;
    public U second;
}
public class Test {
    public int method( Pair< Integer, Integer > pair ) {
        return 0;
    }
    public double method( Pair< Double, Double > pair ) {
        return 1.0;
    }
}

这实际上可以像人们预期的那样编译和工作。但是,如果返回类型相同,则不会编译,并出现预期的“名称冲突:方法(Pair) 和方法(Pair) 具有相同的删除”

鉴于返回类型不是方法签名的一部分,这种重载怎么可能?

最佳答案

考虑以下4种方法

           Java code                        bytecode

m1:    Byte f(List<Byte> list)           f List -> Byte
m2:    Long f(List<Byte> list)           f List -> Long
m3:    Byte f(List<Long> list)           f List -> Byte
m4:    Long f(List<Long> list)           f List -> Long

根据当前的 Java 语言规范,

  • m1 和 m2 不能共存,m3 和 m4 也不能。因为它们具有相同的参数类型。

  • m1 和 m3 可以共存,m1 和 m4 也可以。因为它们有不同的参数类型。

但是javac 6只允许m1+m4,不可以m1+m3。这与方法的字节码表示有关,其中包括返回类型。因此,m1+m4可以,但m1+m3不行。

这是一个 Java 和 JVM 规范不一致的问题。 javac 没有“正确”的方法。

虽然很糟糕,但好消息是,重载是一种虚荣心,而不是必需品。我们始终可以为这些方法使用不同的、更具描述性和独特的名称。

关于java - Java 中的类型删除和重载 : Why does this work?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5527235/

相关文章:

scala 类型删除和值类

java - java删除如何决定进行哪种强制转换来返回类型?

java - Java 十六进制递归问题

java - 在linux下编译java程序

java - 使用递归反向双链表

C++新手问题: designing a function to return a vector of either string or double--overload or template?

c++ - 如何在复制构造函数中调用重载的下标?

java - 谷歌API错误: Null Pointer Exception (Is Google API recently made un available by google?)

c++ - catch block 让我无法匹配运算符(operator)错误

ios - 无法将类型 'AnyDataSource<NSManagedObjectSubclass>' 的值分配给类型 'AnyDataSource<NSManagedObject>' 的值