什么是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-substitutablereturn-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 疑問的解
【什么是subsignature和return-type-substitutable】

    推薦閱讀