我刚开始研究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
}
}
因为你的lambda是隐式类型的(x-
这里通常有几种选择来提供额外的类型信息来消除歧义;使用显式lambda而不是隐式lambda,为泛型方法调用提供显式类型见证,或者添加强制转换来提供显式目标类型。在这种情况下,只有最后一个强制转换才适合您。
真正的问题是,这种超载特别不友好。事实上,编译器会告诉你,如果你用-Wall编译,你会在重载声明中得到警告,在使用站点上会有歧义。
您可以使用类似于强制转换的语法指示正确的类型;
// 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