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

带有重载函数的Java 8 Lambda

汤博
2023-03-14

我刚开始研究Java8Lambda特性。我用Java 7编写了这段代码,并尝试在lamdas中执行它的等效代码。请注意,最后一行产生编译错误,因为重载函数不明确。我明白原因。我怎样才能用lambdas解决这种模糊性?

package com.java8.lambdas;

interface Bounceable{
  void bounce(double howHigh);
}

interface Fly{
  void flies(double howHigh);
}

abstract class Game{
  void play(Bounceable b) {}
  void play(Fly f) {}
}

class Ball extends Game{
   void play(Bounceable b){ b.bounce(10); }
}

class Kite extends Game{
   void play(Fly f){ f.flies(1000); }
}

public class LambdaDemo {

   public static void main(String[] args) {


   System.out.println("======= Java7: ========");
    //Ball game
    Game bg = new Ball();
    bg.play(new Bounceable(){
        @Override
        public void bounce(double howHigh) {
            System.out.println("Ball: Bouncing "+howHigh);
        }
    });

    //Kite game
    Game kg = new Kite();
    kg.play(new Fly(){
        @Override
        public void flies(double howHigh) {
            System.out.println("Kite: flies "+howHigh);
        }
    });


    System.out.println("======= Java8 Lambdas: ========");

    bg.play(x ->System.out.println("lambda: Ball bouncing "+ x));  //Ambiguous of type of Game

}

}

共有2个答案

亢奇
2023-03-14

因为你的lambda是隐式类型的(x-

这里通常有几种选择来提供额外的类型信息来消除歧义;使用显式lambda而不是隐式lambda,为泛型方法调用提供显式类型见证,或者添加强制转换来提供显式目标类型。在这种情况下,只有最后一个强制转换才适合您。

真正的问题是,这种超载特别不友好。事实上,编译器会告诉你,如果你用-Wall编译,你会在重载声明中得到警告,在使用站点上会有歧义。

钱锐
2023-03-14

您可以使用类似于强制转换的语法指示正确的类型;

// bg.Play(Bounceable)
bg.play((Bounceable) x -> System.out.println("lambda: Ball bouncing "+ x));

// kg.Play(Fly)
kg.play((Fly) x -> System.out.println("lambda: Ball bouncing "+ x));

你可以在这个答案中找到更多的信息。

 类似资料:
  • 我有一个类,它将引脚的“列表”作为构造函数中的参数。现在,这个“列表”只是一个const数组(

  • 请考虑以下人为的代码段: 如果第二个重载被更改为采用至少2种类型的包而不是至少一种类型的包时,gcc和clang都接受这两个调用: 如果未推导出的模板参数被移动到推导出的模板参数,则: 我希望每个版本的所有调用都可以。上面代码示例的预期结果是什么?

  • 问题内容: 我知道Python不支持方法重载,但是我遇到了一个似乎无法用一种很好的Pythonic方法解决的问题。 我正在制作一个角色需要射击各种子弹的游戏,但是如何编写用于创建这些子弹的不同功能?例如,假设我有一个函数,该函数创建一个以给定速度从A点移动到B点的子弹。我会写一个像这样的函数: 但是我想编写其他创建项目符号的功能,例如: 以此类推。有没有一种更好的方法可以在不使用太多关键字参数的情

  • 问题内容: 来自C ++背景;) 如何重载PHP函数? 一个函数定义是否有参数,而另一个函数定义无参数?PHP中可能吗?还是应该使用if来检查是否有从$ _GET和POST传递的任何参数?并联系他们? 问题答案: 您不能重载PHP函数。函数签名仅基于它们的名称,并且不包括参数列表,因此不能有两个具有相同名称的函数。PHP中的类方法重载与许多其他语言中的不同。PHP使用相同的词,但是描述了不同的模式

  • C++ 允许定义多个同名函数,只要这些函数有不同参数集(至少有不同类型的参数)。这个功  能称为函数重载(function overloading)。调用重载函数时,C++编译器通过检查调用中的参数个数、  类型和顺序来选择相应的函数。函数重载常用于生成几个进行类似任务而处理不同数据类型的同名  函数。 编程技巧3.15 用函数重载完成类似的任务可以使程序易于阅读和理解。 图3.25用重载函数sq