什么是subsignature和return-type-substitutable
subsignature
什么是签名(signature)
方法签名组成:方法名+参数列表(参数的类型、个数、顺序)
Java语言层面规定的签名是不包含返回值类型的;
JVM层面规定的签名是包含返回值类型的。
常见于:重写和重载
什么是子签名(subsignature)
假定有两个方法m和n,m和n具有相同的方法名,相同的参数列表,并且n的形参类型在调整(类型擦除)之后和m的形参类型相同。此时我们就可以说:
方法m的签名是方法n的签名的子签名。
举个例子:
interface M {
void m(List list);
}
interface N {
void m(List<String> list);
}
interface Demo extends M,N{
//正因为M.m是子签名,所以Demo也是一个函数式接口
//M.m可以覆盖N.m,所以Demo这里选择的是M.m
}
上面代码中的M.m的签名就是N.m签名的子签名,因为N.m的签名经过类型擦除之后就是M.m的签名。
子签名的概念旨在表示两种方法之间的关系,这些方法的签名不完全相同,但是其中一个可以覆盖另一个方法。具体来说,它允许签名不使用泛型类型的方法覆盖该方法的任何泛化版本。
return-type-substitutable
return-type-substitutable 翻译到中文的意思就是:返回类型可替换。
借用上面的例子:
interface M {
List<String> m(List list);
}
interface N {
List m(List<String> list);
}
interface Demo extends M,N{
}
其中,M.m的返回值是List<String>
,N.m的返回值List
,两者可以兼容,即它们的返回类型可替换。
什么意思呢?看看下面这个代码也许你就会明白。
//这个例子只是为了更好理解
List m(List list){
return n(list);
}
List<String> n(List<String> list){
return m(list);
}
也就是说M.m的返回值可以接受N.m的返回值,反过来也是。
详细了解可以看下官方Java语言规范§8.4.5
知乎关于Java8 Functional Interface 疑问的解答
关注微信公众号:西瓜柠檬汁
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义