MethodReference
- 前言
- 特定类任意方法引用
- 函数接口
- 特定类
- 调用
前言
JDK1.8之后提供是Lambda,它可以让开发者自定义函数接口中抽象方法的实现,方法引用可以让开发者直接引用已存在的方法。
方法引用的形式:
- 类::静态方法
- 类::特定类任意方法
- 对象::实例方法
- 类::new
特定类任意方法引用
本篇文章只介绍重点ContainingType::methodName
,其他三种结合静态,实例方法调用很容易理解。
函数接口
public interface Encode<T> {void encode(T t);
}
特定类
public class Base {public void encrypt() {System.out.println("Base::speak");}
}
public class Derive extends Base{@Overridepublic void encrypt() {System.out.println("Derive::speak");}
}
调用
按照规则,静态方法中只能调用静态方法,或者创建实例,通过实例来调用实例方法。但是我们用Base::encrypt
好像是静态方法,但它实际是实例方法,此时就是类::特定类任意方法。其实相当于实例调用实例方法。这个实例我们需要通过 函数接口的第一个参数传入。所以可以这么调用的,函数接口第一个参数的类型必须是被调用方法所在的类。这里就是函数接口的泛型T。也可以不要泛型,那么函数接口的方法第一个参数必须是Base。
public class MethodReference {public static void main(String[] args) {Derive base = new Derive();Encode<Base> encode = Base::encrypt;//这里传入只要是Base类型/子类就会调用相应方法encode.encode(base);System.out.println(encode);}
}
上面实际被调用方法encrypt()是无参的。::
只是生成了方法引用encode,并没有实际调用,实际调用时候,encode.encode(实际方法所在的类对象),这里调用的是Base的encrypt方法还是Derive的,当然是Derive,如果想调用Base的,那么传入的Base对象
如果被调用的是有参的方法呢
Method References