慕瓜9086354
参数化类型信息仅在运行时可用于绑定的代码元素-即专门编译成类型的代码元素。Lambda执行相同的操作,但是由于Lambda不支持方法而不是类型,因此没有类型可以捕获该信息。考虑以下:import java.util.Arrays;import java.util.function.Function;public class Erasure { static class RetainedFunction implements Function { public String apply(Integer t) { return String.valueOf(t); } } public static void main(String[] args) throws Exception { Function f0 = new RetainedFunction(); Function f1 = new Function() { public String apply(Integer t) { return String.valueOf(t); } }; Function f2 = String::valueOf; Function f3 = i -> String.valueOf(i); for (Function f : Arrays.asList(f0, f1, f2, f3)) { try { System.out.println(f.getClass().getMethod("apply", Integer.class).toString()); } catch (NoSuchMethodException e) { System.out.println(f.getClass().getMethod("apply", Object.class).toString()); } System.out.println(Arrays.toString(f.getClass().getGenericInterfaces())); } }}f0并f1按照您的期望保留了它们的通用类型信息。但是由于它们是未绑定的方法,因此已被擦除为Function,f2而f3不是。