|
|
1
6
一般来说,Java将调用最窄的非二义性定义,因此在前几种情况下,如果传递一个窄类型,它将调用最窄的函数;如果传递一个更宽的类型(比如InputStream),您将获得更宽类型的函数(在情况1中,InputStream是方法2)。 Here's a simple test note that downcasting will widen the type, and call the wider type's method . 核心问题是Java是否能够解决一个惟一的调用函数。因此,这意味着如果您提供了一个具有多个匹配项的定义,您需要要么匹配已知的最高类型,要么唯一匹配较宽的类型 没有 也匹配更高的类型。基本上:如果您匹配多个函数,其中一个函数需要在层次结构中更高一点,以便Java解决这个差异,否则调用约定是完全不明确的。 当方法签名不明确时,Java似乎会抛出编译错误。在我看来,案例4是最糟糕的例子,所以我写了一个 quick test 案例5并没有使事情变得更好或更糟:Java没有使用返回类型来消除要调用哪个方法的歧义,因此它不会帮助您——而且由于定义已经不明确,您最终仍然会出现编译错误。 所以快速总结:
最后,如果您怀疑是否调用了您认为应该调用的定义,您应该考虑更改代码以消除歧义,或者指定正确的类型参数来调用“right”函数。Java将告诉您何时它不能做出明智的决定(当事情确实模棱两可时),但是避免这些问题的最佳方法是通过一致和明确的实现。不要做奇怪的事情,比如案例4,这样你就不会遇到奇怪的问题。 |
|
|
2
2
在重载函数的情况下,调用的方法将是 输入对所传递对象的引用。还要注意的是重载方法的绑定是在编译时决定的,而不是在运行时决定的对象类型。 案例1:如果在编译时输入是InputStream类型,那么将调用第二个方法。BufferedInputStream将进入第二个方法。 案例2:这在编译时失败,因为BlockingDeque引用类型不明确,并且参数在扩展这两种类型时可以适合这两种方法中的任何一种 案例3:这里没问题,第三个方法,因为Linkedlist与其他两个参数中的任何一个都不兼容 案例4:模棱两可,因为有了这些论据,我可以使用这两种方法中的任何一种,而且无法识别 案例5:返回类型在重载方法中没有角色可扮演。案例2成立。 |
|
|
3
0
这与关于重载参数的问题有点相悖,但有一个相当明确的理由说明案例5“更糟”。 案例5是使用名为co variant return types的语言特性的地方。它最初并不存在于Java中,但我相信它是在v1.5中添加的(部分原因是这个问题)。如果编译器无法找出正确的返回类型,那么它将失败,在本例中就是这样。 |
|
Fernando Chu · 一个变量有多个可能的类?[关闭] 1 年前 |
|
|
Amaterastis · 基类接受子类和内部子类的模板参数 1 年前 |
|
|
Rishab Negi · 这个关键字在抽象类中是如何工作的 1 年前 |
|
|
dEmigOd · 类层次结构中的运算符重载解析 1 年前 |
|
|
TableTopRug · 如何从Kotlin中的密封类继承? 1 年前 |
|
|
hasdrubal · 抽象基类函数指针python 1 年前 |
|
|
Josh · 通过反思访问孩子的财产 1 年前 |