31、描述以下Test类声明无法编译的原因:public class Test { public void test(T t) { // More code goes here } public void test(U u) { // More code goes here }}
该类无法编译是因为两个 test 方法构成了方法签名冲突。泛型类型参数 <T> 和 <U> 在编译时会被擦除,最终两个方法的签名都变为 void test(Object) ,Java 不允许在同一个类中定义签名相同的方法。
32、Lambda表达式与匿名类有何不同?能否总是用匿名类替换Lambda表达式,反之亦然?
- 语法上 :匿名类语法繁琐,Lambda表达式语法简洁。
- 语义上 :二者存在细微差别。
- 使用场景 :Lambda表达式不能完全替代匿名类,在一些情况下仍需使用匿名类。
33、以下两个 Lambda 表达式是否不同?a. (int x, int y) -> { return x + y; } b. (int x, int y) -> x + y
否,这两个 Lambda 表达式相同,一个使用块语句,另一个使用表达式,都接收两个 int 型参数并返回它们的和。
34、以下 lambda 表达式 x -> x 可能代表哪种函数?
该 lambda 表达式代表一个接受一个参数并返回该参数本身的函数,即恒等函数。
35、以下使用 @FunctionalInterface 注解的 Operations 接口的声明会编译通过吗?请解释你的答案。@FunctionalInterface public interface Operations { int factorial(int n); int abs(int n); }
不会编译通过。因为使用了 @FunctionalInterface 注解,该注解要求接口必须是函数式接口,即只能有一个抽象方法,而此接口定义了两个抽象方法,所以无法编译。
36、以下语句是否能编译?请解释你的答案。Object obj = x -> x + 1;
该语句不能编译。Lambda 表达式需要有明确的目标类型,即它要实现的函数式接口。这里直接将 Lambda 表达式赋值给 Object 类型变量,编译器无法确定其目标类型,所以不能编译。
37、以下语句是否能编译?请解释原因。Function f = x -> x + 1; Object obj = f;
这些语句能编译。
- 第一行创建了一个
Function类型的函数式接口实例,使用lambda表达式实现功能。 - 第二行将
Function对象赋值给Object类型变量,由于Java中所有类都继承自Object类,所以可以进行隐式向上转型,因此能编译。
38、运行以下Scope类会输出什么?
package com.jdojo.lambda.exercises;
import java.util.function.Function;
public class Scope {
private static long n = 100;
private static Function<Long, Long> f = n -> n + 1;
public static void main(String[] args) {
System.out.println(n);
System.out.println(f.apply(n));
System.out.println(n);
}
}
程序的输出为: 100 、 101 、 100 。
- 首先输出静态变量
n的值100, - 接着通过函数
f对n进行加1操作,输出结果101, - 最后再次输出
n,其值未改变,仍为100。
39、为什么下面的方法声明无法编译?public static void test() { int n = 100; Function f = n -> n + 1; System.out.println(f.apply(100)); }
该方法声明无法编译是因为在 Lambda 表达式 n -> n + 1 中,参数 n 与局部变量 n 重名,造成了命名冲突。
40、运行以下Capture类时,输出结果是什么?
package com.jdojo.lambda.exercises;
import java.util.function.Function;
public class Capture {
pu

最低0.47元/天 解锁文章
867

被折叠的 条评论
为什么被折叠?



