带有重载函数的Java 8 Lambda不明确

use*_*412 3 lambda overloading java-8

我刚开始研究Java 8 Lambda功能.我在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

}

}
Run Code Online (Sandbox Code Playgroud)

Joa*_*son 6

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

// 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));
Run Code Online (Sandbox Code Playgroud)

您可以在此答案中找到有关其工作原理的更多信息.