java8 functionalinterface注解_关于java8中的@FunctionalInterface的一个疑惑,什么才是SAM接口?...

先说结论,题主定义的接口如下:

@FunctionalInterface

public interface FunctionalInterfaceAnnotation {

int compare(T o1, T o2);

boolean equals(Object obj);

}

这个接口是符合 SAM 定义的,编译器不会报错,其中,compare 方法就是该接口下唯一的 abstract method,而 equals 则是继承自 Object 类的方法(没错,接口继承了 Object 类),Object 中的 equals 是有具体实现的,因此你所定义的 equals 方法,不算 abstract。

在 IDEA 中,可以直接查看 equals 到底继承自哪里,如下:

现在,再说说什么是 SAM type如果接口中仅包含一个抽象方法声明,我们将该接口称之为 functional interface,functional interface 我们也称之为 SAM (Single Abstract Method) type.

如果接口上标注了 FunctionalInterface 注解,编译器就会对该接口进行检查,确认其是否只包含一个抽象方法,如果不是,就会生成一个编译时错误。

此外,FunctionalInterface 只能标注在接口上,不能标注在 class、annotation、enum 上,否则会报错,该注解只是一个 marker interface。

举几个例子:

示例-1:合法的 SAM type (functional interface) :

@FunctionalInterface

public interface Runner {

void run();

}

示例-2:非法的 SAM type,因为其所含的抽象方法不止一个:

@FunctionalInterface

public interface Job {

void run();

void abort();

}

示例-3:非法的 SAM type, 因为 FunctionalInterface 只能标注在 interface 上:

@FunctionalInterface

public class Test {

public void test() {

}

}

注意:

无论接口是否标注有 FunctionalInterface 注解,只要其仅包含一个 abstract method,这个接口就是 functional interface (SAM type), FunctionalInterface 只是一个 marker interface(标识接口),这样编译器就会为你进行合法性检查,当然,如果你的接口没有标注 FunctionalInterface,只要你的接口符合 SAM type 定义,就仍然可以作为 SAM type (functional interface) 来使用。

至于 Comparator 接口是不是 SAM type,题主根据上述信息,应该可以自行判断了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值