当前位置: 首页 > 知识库问答 >
问题:

Apache Log4j多义性重载方法

康元凯
2023-03-14

Apache log4j2.12.1中的接口org.Apache.logging.Log4j.logger有以下两个方法:

void info(String message, Object... params);

void info(String message, Supplier<?>... paramSuppliers);

在我的代码中,我的意图是调用第二个方法,第二个arg是一个lambda paramsupplier。令人惊讶的是,在运行时调用了第一个方法,它打印了lambda的obj引用,而不是实际的param值。

我很困惑为什么编译器没有将这些方法标记为歧义。这是在Java11上。我还看到许多其他方法,在同一个logger接口中,方法签名的区别只是一个方法接受object,另一个方法接受suppliver ,位于args列表中相同的位置,所有其他方法args的类型和顺序都是匹配的。

  1. 用泛型和lambdas重载方法时方法调用不明确
  2. (Java 8)Java.util.function.supplier

共有1个答案

柯曜文
2023-03-14

根据您的描述,我可以假设问题是supplier接口的包名不正确,按照规则我们使用java.util.function.supplier,但是org.apache.logging.log4j.logger接口需要org.apache.log4j.util.supplier包的supplier接口,第二个方法将在更改包名后调用。

如果一切如我上面所说的那样,那么二义性的问题就很简单了,签名与第二个方法不匹配,并且void info(String message,object...params);对于不匹配的参数类型,方法将作为默认调用,因为Java中的任何类都由object类扩展,并且任何lambda表达式都是对象。

 类似资料:
  • 让我们用这个简单的Java代码: 我试图找出这三个ate()方法的哪个版本将运行。现在,当我键入 结果是“普通动物一般地吃”,这是完全可以理解的。 当我输入时也会发生同样的事情: 结果是“吃干草的马”,这也是完全合乎逻辑的。 这就是我困惑的地方。当我输入: 我得到: 我期望编译器从动物类引用调用ate()方法,而不是马对象引用。 所以我的问题是,当我有一个泛型引用变量类型引用一个对象类型时(比如:

  • 问题内容: 让我们看一下这个简单的Java代码: 我试图找出三个eat()方法的哪个版本。现在,当我键入 输出是“一般动物食用”,这是完全可以理解的。 当我键入以下内容时,会发生相同的事情: 输出是“吃干草的马”,这完全是合乎逻辑的。 这就是让我感到困惑的地方。当我键入: 我得到: 我希望编译器从Animal类引用而不是Horse对象引用中调用eat()方法。 所以我的问题是,当我有一个引用对象类

  • 问题内容: 这是我遇到的一个测试练习问题,希望您能帮助我理解概念 让Hawk成为Bird的子类。假设某个类有两个重载的方法void foo(Hawk h)和void foo(Bird b)。在声明Bird x = new Hawk()之后,将在调用foo(x)中执行哪个版本; 这是我到目前为止的代码,有人可以向我解释为什么foo(bird b)被执行吗? 问题答案: Java执行重载解析以选择方法

  • 本文向大家介绍Java Varargs中的方法重载和歧义,包括了Java Varargs中的方法重载和歧义的使用技巧和注意事项,需要的朋友参考一下 在Java中使用变量参数时存在歧义。发生这种情况是因为两种方法绝对可以有效地被数据值调用。因此,编译器不知道该调用哪种方法。 示例 输出结果 名为Demo的类定义了一个名为“ my_fun”的函数,该函数采用可变数量的浮点值。使用“ for”循环将这些

  • 下面的例子属于哪个概念:方法重载还是方法重写???

  • 我想使用另一个映射器中的一个映射器,并且这两个映射器都使用相同的签名实现相同的方法,因此我得到了“mapping Property的mapping methods found for mapping property” 我已经尝试在接口上实现共享方法,然后在两个映射器上扩展接口,但问题仍然存在 我想我需要使用某种限定词。我在谷歌和官方文档中搜索,但我不知道如何应用这项技术