今天学习了的主要内容:
1.泛型函数式接口
2.标记接口类型变量赋值
泛型函数式接口:
Lambda表达式可以赋值给泛型函数式接口类型的变量。
禁止将Lambda表达式赋值给那些带有泛型方法、但不是泛型类型的函数式接口类型变量。这点只能通过方法引用或匿名内部类来解决。
标记接口类型变量赋值:
使用 & 将标记接口与函数式接口进行连接,组成交际类型,再赋值即可。
LambdaTest05类(测试泛型函数式接口):
package LessonForLambda04;
@FunctionalInterface
interface Functionalable1
{
//函数式接口中可以有Object类的方法。
void getInfor1();
boolean equals(Object obj);
String toString();
}
@FunctionalInterface
interface Functionalable2<T>
{
T getInfor2(T t);
}
@FunctionalInterface
interface Functionalable3
{
<T> T getInfor3(T t);//函数式接口中只有一个泛型方法,但是接口不是泛型
}
public class LambdaTest05
{
public static void main (String args[])
{
Functionalable2<String> f21 = t->{
return t.concat("zlm");};
System.out.println(f21.getInfor2("wualalalal"));
System.out.println("---------");
//函数式接口中只有一个泛型方法,但是接口不是泛型
//Functionalable3 f31 = t->{return t.concat("zlm");};这样写就报错了
}
}
MarkedInterDemo类(测试标记接口类型变量赋值):
package LessonForLambda04;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
//标记接口中没有任何方法
interface MarkedInterf
{
}
@FunctionalInterface
interface MyFuncInterf
{
void method();
}
@FunctionalInterface
interface MyFuncInterf2
{
int method(int a, int b);
}
public class MarkedInterDemo
{
public static void main(String[] args)
{
//使用&将标记接口与函数式接口进行连接,组成交际类型,再赋值即可。
MarkedInterf mif1 = (MarkedInterf & MyFuncInterf)()->{
System.out.println("WDNMD");};
MyFuncInterf2 mfi1 = (int a, int b)->{
return a+b;};
MarkedInterf mif2 = (MarkedInterf & MyFuncInterf2)(int a, int b)->{
return a+b;};
System.out.println(mfi1.method(1, 2));
Class<?> c1 = MyFuncInterf2.class;
try
{
Method m1 = c1.getMethod("method",int.class,int.class);
int a = (int)m1.invoke(mif2,1,2);
System.out.print(a);
} catch (NoSuchMethodException | SecurityException | IllegalAccessException |
IllegalArgumentException | InvocationTargetException e)
{
e.printStackTrace();
}
}
}
本篇文字来源于:
咕嘟咖啡杨海滨老师 — 《java编程语言高级特性》
在这里十分感谢老师能够给我带来学习的激情。
2020.10.19
可以转载我的学习日记但请注明出处,谢谢。
本文章是本人学习笔记,不进行任何商用!只为记录本人学习历程。
毕