0

在下面的代码中,我尝试调用获取供应商的 info 方法。(info 方法被重载:一个是 String,另一个是 Supplier。)编译器抱怨“方法 info(String) 不适用于参数Supplier<Double>”。我的期望是通过发送 Supplier 对象来调用获取 Supplier 的 info 方法。我可以得到一些帮助来理解这个错误吗?

Supplier<Double> randomSupplier = new Supplier<Double>()
{   public Double get()
    {   return Math.random(); }    
};

logger.info(randomSupplier); <----
4

2 回答 2

6

假设你logger是一个java.util.logging.Logger. . .

根据Javadoc forLogger.info,它需要一个Supplier<String>,而你给它一个Supplier<Double>.

要解决此问题,您需要给它一个Supplier<String>. 你可以这样写一个:

final Supplier<String> randomSupplier =
    new Supplier<String>() {
        public String get() {
            return Double.toString(Math.random());
        }
    };

或像这样:

final Supplier<String> randomSupplier =
    () -> Double.toString(Math.random());

你甚至可以写:

logger.info(() -> Double.toString(Math.random()));

Java 会神奇地推断出你的 lambda 是一个Supplier<String>(因为另一个重载info不采用函数式接口类型)。

于 2018-09-01T17:50:50.320 回答
1

您可以尝试以这种方式进入Supplierjava 8 方式并通过转换Supplier为进行日志记录String

Supplier<Double> randomSupplier = () -> Math.random();
info(randomSupplier);

  private void info(Supplier<Double> randomSupplier) {
    System.out.println(randomSupplier.get());
 }
于 2018-09-01T17:44:56.563 回答