【发布时间】:2016-01-10 12:05:26
【问题描述】:
所以,我目前正在研究 lambda 表达式,刚刚遇到了一个带有通用函数接口的示例:
@FunctionalInterface
public interface Mapper<T> {
int map(T source);
public static <U> int[] mapToInt(U[] list, Mapper<? super U> mapper) {
int[] mappedValues = new int[list.length];
for(int i = 0; i< list.length; i++) {
mappedValues[i] = mapper.map(list[i]);
}
return mappedValues;
}
}
和测试代码
public static void main(String[] args) {
System.out.println("Mapping names to their lengths:");
String[] names = {"David", "Li", "Doug"};
int[] lengthMapping = Mapper.mapToInt(names, (String name) -> name.length());
printMapping(names, lengthMapping);
}
public static void printMapping(Object[] from, int[] to) {
for(int i = 0; i < from.length; i++) {
System.out.println(from[i] + " mapped to " + to[i]);
}
}
所以,困扰我的是,在这个示例中,我们将Mapper 功能接口的实例作为第二个参数传递给测试代码中的mapToInt 方法。但是,在这个例子中,Mapper 的形参 <T> 的值是多少?这似乎可行,但是如果从未指定形参的参数,编译器怎么能解决这个问题?
可能是因为,抽象方法:
int map(T source);
使用 T 参数,并基于 lambda 表达式参数,将其用作 T 的真实类型?
另外,mapToInt 中的第二个参数:Mapper<? super U> mapper,同样的问题,在此示例中,Mapper、<? super U> 的类型的值是多少?
【问题讨论】: