gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:40:31 25 4
gpt4 key购买 nike

我有以下代码:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com