繁体   English   中英

该方法含糊不清

The method is ambiguous

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我试图理解方法重载,我无法理解以下示例中出现以下代码错误的原因

public class OverLoading_OverRiding {
     public static void main(String[] args) {
        OverLoading_OverRiding o = new OverLoading_OverRiding();
        o.sum(5, 5);
    }

    void sum(int i, long j) {   }
    void sum(long i, int j) {   }
}

我收到一个错误:

方法sum(int,long)对于OverLoading_OverRiding类型是不明确的。

当我在同一个例子上执行显式转换时,它可以工作:

    o.sum(5, (long)5);
6 个回复

问题是如果你调用o.sum(5, 5); ,你的编译器不知道使用哪种方法o.sum(5, 5);

  1. 他可以使用void sum(int i, long j) { } ,其中前5个为int,第5个为long

  2. 他可以使用void sum(long i, int j) { } ,其中前5个为长,第5个为int

因为这两个方法在这个例子中都有效,并且你的编译器总是需要一个有效的选项,所以你得到的错误信息是你的方法不明确。

如果你打电话给o.sum(5, (long)5); 它只匹配方法void sum(int i, long j) { }


问题是,为什么要以这种方式重载方法? 大多数重载用于可选参数,如下所示:

void myMethod(int i) {}
void myMethod(int i, bool b) {}
void myMethod(int i, string s) {}

所以你可以这样调用这个方法:

myMethod(42);
myMethod(42, true);
myMethod(42, "myString");

也许这会让你了解方法重载。

我无法正确理解模糊类型错误的原因

编译器说它不知道调用哪种方法。 因为电话是模棱两可的。

由于5可以作为longint呈现,因此编译器无法在没有更多信息的情况下推断要调用两种方法中的哪一种,因为它们的方法签名与同一调用兼容。

当您将第二个参数转换为long ,编译器可以推断出可以使用第二个签名,因为没有其他选项。

也:

o.sum((int)5, 5); // or long

将出于同样的原因工作

这是原因,

案例1:总和(int a,long b);

这里sum(5,5)匹配此方法。

怎么样 ? 由于第一个参数是int,调用方法也是int。 现在下一个参数很长,但我们传递int。 所以呢? 它满足加宽转换/隐式类型转换。

隐式类型转换的示例:

int i=10;
double j;
j=i;
System.out.println(j);  // Output j=10.0

同样的事情发生在这里,sum(5,5)匹配=> sum(int,long)和sum(long,int)

案例2:总和(长a,int b)

sum(5.0,5)匹配两种方法

这是因为5可能是隐式长或整数。因此,方法调用是不明确的。

简单的你要在你的方法中传递适当的参数,在你的第一种情况下是o.sum(5,5l)这里第一个参数是int 5,第二个是5L for long和你的第二个案例(5l,5)。 这样可以正常工作

1 为什么这个方法调用含糊不清?

为什么第一次调用Foo下面编译但第二次调用会导致模糊的调用编译器错误? (使用c#7.2) private static void AmbiguousAsyncOverload() { Foo(() => Bar()); // This is OK ...

2 SCJP问题:方法含糊不清

看看这段代码: 编译器给出一个错误,调用是不明确的: 说明资源路径位置类型方法flipFlop(String,int,Integer)对于Test Test.java scjp19类型是不明确的 - inheritence / src第3行Java问题 但是如果使用注释 ...

2010-03-07 17:03:39 4 551   java/ scjp
3 CRTP含糊不清

当我使用CRTP( 奇怪地重复使用模板模式 )时,当基类(显式)可转换为bool ,也可转换为Derived类型时, 出现编译器错误。 如果我尝试使用ostream将Derived类型作为rvalue输出,则会发生编译器错误。 例如 : 这给出了编译器错误: 问题 :这是编译 ...

4 含糊不清的语法?

嗨,书中有这个问题说 鉴于这个语法 a-它产生什么 b-显示含糊不清 现在我想到的答案是 a-adjecent paranthesis b-它生成不同的解析树,所以它的不明确,我画了两个场景。 这是对的还是有更好的答案? ...

5 模版含糊不清

我有一个带有paint()模板函数的Painter模板类。 我正在使用标记来专门化模板类中的模板功能。 我已经把模板函数定义paint()内Painter.h和重载的内部功能Painter.cpp 。 当我在Painter.cpp显式实例化paint() , Painter.cpp编译 ...

7 为什么这个含糊不清?

当我查询这个: 我明白了 我认为将别名添加到w_homepage_package_id可以防止歧义。 我是否必须将别名添加到LEFT JOIN,或者如何从查询中获取w_homepage_package_id? ...

2014-02-18 12:36:32 3 82   php/ sql
8 模板含糊不清

有人可以解释为什么以下内容由于歧义而未能遵守 但是,如果我用P替换std::tuple ,歧义将被消除。 如果我将P<Ts...>或P<Us...>替换为一个称为Pack的简单类型,也会将其删除。 我正在使用GCC 7.2。 当然, foo<P< ...

9 真相含糊不清

我有一个看起来像这样的数据集: 我想做的是,当TYPE = 3.0时,将TYPE_ADJ设为TYPE的最后一个非3.0值。 即在上面的数据中将是: 我尝试了以下代码: 我收到以下错误: ValueError:系列的真值不明确。 使用a.empty,a.boo ...

10 为什么函数含糊不清?

在g ++(v4.7.3)上编译示例代码时,出现错误: 以下是示例代码。 不明白为什么歧义:编译器应该知道将main()中的notify()调用映射到第一个声明。 void notify(const char *fmt, ...) 。 有任何想法吗? 谢谢。 ...

2015-09-07 16:16:40 1 125   c++
暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM