- 64
- 0
代码如下
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("hello");
list.add("alex");
list.add("front");
BiConsumer<List<String>, String> v = List::add;
System.out.println(v == null);
v.accept(list, "ddd");
System.out.println(list);
}
IDE为IDEA,不报错,正常运行。
我的疑问在于为什么下面这句话没有报错:
BiConsumer<List<String>, String> v = List::add;
List是个接口,add方法只有声明没有具体的实现,而且其前面明显和BiConsumer接口的accept不匹配。
BiConsumer接口定义:
@FunctionalInterface
public interface BiConsumer<T, U> {
void accept(T t, U u);
default BiConsumer<T, U> andThen(BiConsumer<? super T, ? super U> after) {
Objects.requireNonNull(after);
return (l, r) -> {
accept(l, r);
after.accept(l, r);
};
}
}
List::add的方法签名:
boolean add(E e);
————————————————————————————————————————————
另外如果我把泛型去掉,变成下面这样就报错了:
BiConsumer v = List::add;
这又是为什么?
- 共 0 条
- 全部回答
-
遗失的美好 普通会员 1楼
在Java 8中,可以使用泛型来引用接口的抽象方法,这是为了支持泛型与接口方法的交互。下面是一种可能的使用方式:
```java public interface MyInterface { abstract void myAbstractMethod(); }
public class MyClass extends MyInterface { @Override public void myAbstractMethod() { System.out.println("This is an abstract method in MyClass"); } }
public class Main { public static void main(String[] args) { MyClass myClass = new MyClass(); myClass.myAbstractMethod(); } } ```
在这个例子中,我们定义了一个名为
MyInterface的接口,其中有一个抽象方法myAbstractMethod。然后,我们创建了一个MyClass实例,这个实例继承自MyInterface接口。在MyClass类的myAbstractMethod方法中,我们使用了@Override注解来指定这个方法是接口中的抽象方法。当我们调用
myClass.myAbstractMethod()时,编译器会根据MyClass的接口类型推断出myAbstractMethod方法的签名,然后将其作为方法引用传递给MyClass的实例。在Java 8中,接口的抽象方法实际上是一个默认方法,也就是说,如果这个方法在接口中没有定义,那么它将被推断为一个默认方法。这使得我们可以通过使用接口的抽象方法作为方法引用,从而间接地调用接口中的抽象方法,而无需显式地声明方法的签名。注意,如果接口中的抽象方法没有定义,那么在编译时,编译器将报错。在这种情况下,我们需要显式地声明这个方法的签名,或者使用
@Override注解指定这个方法是接口中的抽象方法。例如:```java public interface MyInterface { @Override default void myAbstractMethod() { System.out.println("This is an abstract method in MyClass"); } }
public class MyClass extends MyInterface { @Override public void myAbstractMethod() { System.out.println("This is an abstract method in MyClass"); } }
public class Main { public static void main(String[] args) { MyClass myClass = new MyClass(); try { myClass.myAbstractMethod(); // 错误,因为没有定义抽象方法 } catch (NoSuchMethodException e) { e.printStackTrace(); } } } ```
在这个例子中,我们仍然使用了接口的抽象方法作为方法引用,但是由于没有定义这个方法,编译器将抛出
NoSuchMethodException,因为我们在接口中没有声明这个方法的签名。然而,我们可以通过显式地声明这个方法的签名,例如在MyClass类中:```java public interface MyInterface { @Override default void myAbstractMethod() { System.out.println("This is an abstract method in MyClass"); } }
public class MyClass extends MyInterface { @Override public void myAbstractMethod() { System.out.println("This is an abstract method in MyClass"); } } ```
在这个例子中,我们在
MyClass类的myAbstractMethod方法中声明了方法的签名,这使得编译器可以正确地编译并运行这个方法。
- 扫一扫访问手机版
回答动态

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器更新之后。服务器里面有部分玩家要重新创建角色是怎么回事啊?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题函数计算不同地域的是不能用内网吧?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题ARMS可以创建多个应用嘛?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题在ARMS如何申请加入公测呀?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题前端小程序接入这个arms具体是如何接入监控的,这个init方法在哪里进行添加?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器刚到期,是不是就不能再导出存档了呢?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器的游戏版本不兼容 尝试更新怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器服务器升级以后 就链接不上了,怎么办?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器转移以后服务器进不去了,怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器修改参数后游戏进入不了,是什么情况?预计能赚取 0积分收益
- 回到顶部
- 回到顶部
