6

暑假我在做一些自学,我遇到了这个我不确定的问题,我想知道是否有人可以帮忙。我不确定最后一个数字,但如果有人愿意检查这些,我会包括我以前的答案。这不是任何课程的作业,我只是想确保在继续前进之前了解自己在做什么。

我正在考虑以下定义:

1. void m (Object o, long x, long y)
2. void m (String s, int x, long y)
3. void m (Object o, int x, long y)
4. void m (String s, long x, int y)

其中这些声明:

Object o;
String v;
int a;
long b;

我正在检查这些电话:

m(v,a,b); Calls 2, because it is the most specific.
m(v,a,a); Not legal, because 2 and 4 could both be called (not specific enough).
m(v,b,a); Calls 4, because it is the most specific. 
m(v,b,b); Calls 1, because it is the only one that will fit (long cannot shorten to int).
m(o,b,b); Calls 1, similar reasoning as above answer.
m(o,a,a); Unsure.  I'm not sure of the precedence.

提前致谢!

4

3 回答 3

2

最后一个将调用 3。由于第一个参数是 Object,它只能选择一个以 Object 作为第一个参数的方法——因此留下 1 或 3 作为选项。第三个论点int符合long在这两种情况下都是合法的。第二个参数可以完全适合 3,而它必须被扩大以适合 1。编译器优先考虑精确匹配而不是扩大。

你之前的回答也是正确的。

于 2013-05-27T18:54:57.180 回答
2

这又是一个“最具体”的简单案例。选择选项 3 的原因与您的第二次通话是非法的相同。m(v,a,a)不能在 和 之间进行选择m(String,long,int)m(String,int,long)因为它们同样具体。每一个都需要对其中一个论点进行一次扩大转换。m(o,a,a),另一方面,可以在 和 之间进行m(Object,long,long)选择m(Object,int,long)。其中之一需要两次扩大转换。另一个只需要一个,使其最具体。

于 2013-05-27T19:00:30.033 回答
0

m(v,b,b); 调用 1,因为它是唯一适合的(long 不能缩短为 int)。

调用 1 的另一个原因是由于 Java 的多态性和单根层次结构。字符串(或任何对象)是 Object 类的后代。任何将 Object 作为参数的方法都可以使用 String——多态的本质。

于 2013-05-27T20:57:25.130 回答