Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 有没有办法在函数接口中重载抽象方法?_Java_Java 8_Overloading_Functional Interface - Fatal编程技术网

Java 有没有办法在函数接口中重载抽象方法?

Java 有没有办法在函数接口中重载抽象方法?,java,java-8,overloading,functional-interface,Java,Java 8,Overloading,Functional Interface,我希望能够提供一个功能接口,可以接受几种不同类型的lambda函数 我读书。这个问题的第一个答案澄清了为什么在函数接口中重载抽象方法会导致未定义的行为。但是,如果我提供了所有的默认值,是否有一种方法可以相当于在函数接口中重载抽象方法 我希望能够编写如下代码: Ball b=()->System.out.println(“你击中了它!”); Ball ba=(布尔未命中)->System.out.println(未命中); b、 命中(); b、 命中(假); ba.hit(); ba.hit(假

我希望能够提供一个功能接口,可以接受几种不同类型的lambda函数

我读书。这个问题的第一个答案澄清了为什么在函数接口中重载抽象方法会导致未定义的行为。但是,如果我提供了所有的默认值,是否有一种方法可以相当于在函数接口中重载抽象方法

我希望能够编写如下代码:

Ball b=()->System.out.println(“你击中了它!”);
Ball ba=(布尔未命中)->System.out.println(未命中);
b、 命中();
b、 命中(假);
ba.hit();
ba.hit(假);;
预期的结果将是:

You hit it!
default false
default hit
false
考虑以下(不可编译的)代码(大部分是从链接问题中复制的):

我正在寻找可以编译的代码的替代方案


关于函数接口的第一件事是,它只能有一个抽象方法。在这种情况下,你甚至不能想到第二个方法(也可以是抽象方法)。您可以有任意数量的默认方法

所以答案是100%不可能的,当您保留@functionanterface注释时,上面的代码将出现编译错误,这严格禁止保留多个抽象方法。 按照你的代码

@FunctionalInterface
public interface MyInter {
    public abstract void fly();

    public abstract void fly(int a);

    default void fly() {}          \\line1
    default void fly(int g) {   }   \\line2
}
第1行和第2行将抛出编译时错误,因为java认为它们的方法名相同,参数类型相同,它们永远不会担心返回类型或默认值等(重载的主要规则)

如果删除第1行和第2行,那么太多代码将抛出错误,因为@functionanterface将给出编译错误,声明无效的“@functionanterface”注释;MyInter不是一个功能接口


希望这能回答您的问题……

您可以这样做。但是您需要正确地命名变量,以跟踪
arg
和接受它的
消费者

@FunctionalInterface
interface Ball<T> {
   void hit();

   static <T> Ball<T> withArg(T arg, Consumer<T> com) {
      return () -> com.accept(arg);
   }
}

public class Demo {
   public static void main(String[] args) {
      Ball<Boolean> b = () -> System.out.println("You Hit it!");
      b.hit();
      Ball<Boolean> ba = Ball.withArg(false, a -> System.out.println(a));
      Ball<Boolean> bb = Ball.withArg(true, a -> System.out.println(a));
      ba.hit();
      bb.hit();
   }
}
@functioninterface
接口球{
无效命中();
带arg的静态球(T arg,消费者com){
return()->com.accept(arg);
}
}
公开课演示{
公共静态void main(字符串[]args){
球b=()->System.out.println(“你击中了它!”);
b、 命中();
Ball ba=Ball.withArg(false,a->System.out.println(a));
Ball bb=Ball.withArg(true,a->System.out.println(a));
ba.hit();
bb.hit();
}
}

您可以将接口包装在一个类中,然后在内部将方法调用传递给接口

示例代码:

公共类测试{
公共静态void main(字符串…参数)引发异常{
Ball b=新球(()->System.out.println(“你击中了!”);
Ball ba=新球((布尔未命中)->System.out.println(未命中));
b、 命中();
b、 命中(假);
ba.hit();
ba.hit(假);;
}
公共静态类球{
最后一击a;
最终希特勒b;
公众球(打a){
这个a=a;
b=(未命中)->System.out.println(“默认”+miss);
}
公共舞会(HITB){
这个.b=b;
a=()->System.out.println(“默认命中”);
}
公开无效点击(){
a、 命中();
}
公共无效命中(布尔未命中){
b、 击中(未击中);
}
}
公共接口命中率{
无效命中();
}
公共接口{
无效命中(布尔未命中);
}
}
程序的输出:

You hit it!
default false
default hit
false

函数接口只允许一个抽象方法。请注意,一个接口中不能有两个方法定义,即使一个是抽象的,另一个是默认的。你试过编译你的代码吗?我认为它不会被编译@Yehuda@KartikSoneji正如问题中所述,代码是不可编译的。我正在寻找一种方法来创造一些等价物(注意已接受答案下方的答案)
You hit it!
default false
default hit
false