gpt4 book ai didi

java - 为什么不能使用具有多态返回类型的原始类型?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:55:33 25 4
gpt4 key购买 nike

考虑以下两个类:

public interface Foo<T>
{
public T moo();
}

public class IntFoo implements Foo<Integer>
{
public int moo()
{
return 0;
}
}

这段代码会在publicintmoo产生一个错误,表示int 与重写方法的返回类型 Integer 不兼容。严格来说,这是真的,因为 int 并不直接等于 Integer。但是,我们都知道可以使用自动(取消)装箱将它们隐式地相互转换。鲜为人知的是,编译器在此示例中生成了一个桥接方法:

public class IntFoo implements Foo<Integer>
{
public <synthetic> <bridge> Object moo()
{
return this.moo(); // upcast
}

public Integer moo() {
return 0;
}
}

必须这样做,因为 JVM 在解析方法时会区分返回类型,并且由于 Foo.moo 的删除返回类型是 Object,编译器生成了一个与方法具有相同签名的桥接方法。

我想知道为什么这对原始多态返回类型也不起作用:

public class IntFoo implements Foo<Integer>
{
public <synthetic> <bridge> Object moo()
{
return Integer.valueOf(this.moo());
}

public int moo()
{
return 0;
}
}

似乎没有任何理由不具备此功能:

IntFoo intFoo = new IntFoo();
Foo<Integer> foo = intFoo;
Integer i = foo.moo(); // calls the synthetic method, which boxes the result of the actual implementation

事实上,这张 REPL session 的屏幕截图显示我什至能够在我的 custom programming language 中实现它(编译成 Java 字节码):

REPL session

最佳答案

对于这些问题,答案是您必须询问语言设计者。我看不出有任何理由无法做到这一点。但是,在我看来,此功能毫无意义。正如您在问题中指出的那样,只有在 moo 时在静态类型的变量上调用 IntFoo将返回一个原语;在 Foo<Integer> 类型的变量上, 一个 Integer无论如何都会被退回。因此,您可以通过这样做获得基本相同的结果。

public class IntFoo implements Foo<Integer> {

@Override
public Integer moo() { return mooAsInt(); }

public int mooAsInt() { return 0; }
}

我个人认为这更好,因为当拳击发生/不发生时它更加明显。在你的提案中,moo()可以返回 intInteger取决于变量的静态类型,这会非常困惑。

关于java - 为什么不能使用具有多态返回类型的原始类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32418456/

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