泛型函数式接口

lambda表达式自身不能指令类型形参.因此,lambda表达式不能是泛型(当然,由于存在类型推断,所有lambda表达式都展现出一些类似于泛型的特征).然而,与lambda表达式关联的函数式接口可以是泛型的.在这种情况下,lambda表达式的目标类型部分由声明函数式接口引用时指定的实参类型来决定.
为了理解泛型函数式接口的值,考虑这样的情况.本章前面的两个示例创建了两个不同的函数式接口,一个叫做numericTest,另一个叫做StringFunc.这两个接口都用于确定两个值是否满足某个条件.为此,他们都定义了一个叫做func()的方法,该方法接受两个形参并返回一个boolean类型的结果.对于第一个接口,func()方法的形参类型为int.对于第二个接口,func()方法的形参类型和返回类型是String.因此,两个方法的唯一区别是他们需要的数据的类型.针对这种情况,使用泛型接口也是可行的.相较于使用两个其他方法只是在数据类型上存在区别的函数式接口,也可以只声明一个泛型接口来处理这两种情况 ,下面的程序演示了这种方法:
public class test2
{
    public static void main(String args[])
    {
     SomeTest<Integer> isFactor =  (n,d)->(n%d)==0;
     if(isFactor.test(10, 2))
         System.out.println("2 is a factor of  10");
     
     SomeTest<Double> isFactorD =  (n,d)->(n%d)==0;
     if(isFactorD.test(212.0, 4.0))
         System.out.println("4.0 is a factor of  212.0");
     
     SomeTest<String> isIn = (a,b)->a.indexOf(b)  != -1;
     if(isIn.test("Genneric Functional  Interface", "face"))
         System.out.println("face is found");
    }
}
interface SomeTest<T>
{
    boolean test(T n,T m);
}
输出如下所示:
2 is a factor of 10
4.0 is a factor of 212.0
face is found
在该程序中,泛型函数接口SomeTest的声明如下所示:
interface SomeTest<T>
{
    boolean test(T n,T m);
}
其中,T指定了test()函数的形参类型,这意味着他与任何接受两个相同类型的形参,并返回一个boolean类型值的lambda表达式相兼容.
SomeTest接口用于提供对三种不同类型的lambda表达式的引用.第一种表达式使用Integer类型,第二种表达式使用double类型,第三种表达式使用String类型.因此,同一个函数式接口可以用于引用isFactor,isFactorD和isIn表达式,区别仅在于传递给someTest的类型实参.
问:除了变量初始化,赋值和实参传递外,还有什么也构成了目标类型上下文?
答:类型转换,运算符,数组初始化器,return语句以及lambda表达式自身也构成了目标类型上下文.