2 回答

TA貢獻1852條經驗 獲得超7個贊
您需要覆蓋類setListener(OnSadListener)中的方法Baby,因為您從不設置偵聽器。
class Baby extends Person {
OnCryingListener listener;
@Override
void setListener(OnSadListener listener) {
this.listener = (OnCryingListener) listener;
}
void cry() {
listener.imSad();
listener.imCrying();
}
}
一個更完整的例子如下......
class Person {
protected OnSadListener listener; // Make it protected or add accessor/mutators
void setListener(OnSadListener listener) {
this.listener = listener;
}
}
通過使listener受保護,您可以重用Person類' OnSadListener。您只需要將偵聽器強制轉換為 aOnCryingListener即可調用該imCrying()方法。
class Baby extends Person {
@Override
void setListener(OnSadListener listener) {
this.listener = (OnCryingListener) listener;
}
void cry() {
listener.imSad();
((OnCryingListener) listener).imCrying(); // Cast here
}
}
更新
如果你想使用泛型,你可以去掉強制轉換的需要。
public class Person <T extends OnSadListener> {
protected T listener;
public void setListener(T listener) {
this.listener = listener;
}
}
現在您可以知道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貢獻1946條經驗 獲得超4個贊
字段在 Java 中不會被“覆蓋”。只有方法被覆蓋。
由于您假設字段被覆蓋,因此在此示例中,您期望對象中只listener
存在一個字段Baby
。并且您期望在調用michael.setListener()
.
但實際上,一個Baby
對象中有 2 個字段。調用時michael.setListener()
,只設置類中聲明的字段Person
。
添加回答
舉報