2 回答

TA貢獻(xiàn)1852條經(jīng)驗(yàn) 獲得超7個(gè)贊
您需要覆蓋類setListener(OnSadListener)中的方法Baby,因?yàn)槟鷱牟辉O(shè)置偵聽器。
class Baby extends Person {
OnCryingListener listener;
@Override
void setListener(OnSadListener listener) {
this.listener = (OnCryingListener) listener;
}
void cry() {
listener.imSad();
listener.imCrying();
}
}
一個(gè)更完整的例子如下......
class Person {
protected OnSadListener listener; // Make it protected or add accessor/mutators
void setListener(OnSadListener listener) {
this.listener = listener;
}
}
通過使listener受保護(hù),您可以重用Person類' OnSadListener。您只需要將偵聽器強(qiáng)制轉(zhuǎn)換為 aOnCryingListener即可調(diào)用該imCrying()方法。
class Baby extends Person {
@Override
void setListener(OnSadListener listener) {
this.listener = (OnCryingListener) listener;
}
void cry() {
listener.imSad();
((OnCryingListener) listener).imCrying(); // Cast here
}
}
更新
如果你想使用泛型,你可以去掉強(qiáng)制轉(zhuǎn)換的需要。
public class Person <T extends OnSadListener> {
protected T listener;
public void setListener(T listener) {
this.listener = listener;
}
}
現(xiàn)在您可以知道Baby正在處理的偵聽器類型。
public class Baby extends Person<OnCryingListener> {
@Override
public void setListener(OnCryingListener listener) {
this.listener = (OnCryingListener) listener;
}
public void cry() {
listener.imSad();
listener.imCrying(); // No need to cast
}
}

TA貢獻(xiàn)1946條經(jīng)驗(yàn) 獲得超4個(gè)贊
字段在 Java 中不會(huì)被“覆蓋”。只有方法被覆蓋。
由于您假設(shè)字段被覆蓋,因此在此示例中,您期望對(duì)象中只listener
存在一個(gè)字段Baby
。并且您期望在調(diào)用michael.setListener()
.
但實(shí)際上,一個(gè)Baby
對(duì)象中有 2 個(gè)字段。調(diào)用時(shí)michael.setListener()
,只設(shè)置類中聲明的字段Person
。
添加回答
舉報(bào)