什麼是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 疑問的解答