gpt4 book ai didi

java - 类型安全的通用 Java 观察器编译时错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:43:29 25 4
gpt4 key购买 nike

要求

我正在尝试编写一对 Observer/Observable 类。我想对 Observer 进行参数化,以便可以进行类型安全的更新调用。想象一下这个版本:

class View implements Observer<Model> {
@Override
public void update(Model model) { render(model); } // no casting:)
}

而不是这个需要转换的版本:

class View implements Observer {
@Override
public void update(Object model) { render((Model) model); } // casting:(
}

尝试

这是我目前所拥有的。我的 Observer 界面:

public interface Observer<T extends Observable> {
public void update(T observable);
}

和我的 Observable 抽象类:

import java.util.List;

public abstract class Observable {
private List<Observer<? extends Observable>> observers;

public Observable() {
System.out.println(this.getClass());
}

public void addObserver(Observer<? extends Observable> obs) {
observers.add(obs);
}

public void removeObserver(Observer<? extends Observable> obs) {
observers.remove(obs);
}

protected <E extends Observable> void updateObservers(E self) {
for (Observer<? extends Observable> obs : observers) {
obs.update(self); // <-------------------- COMPILER ERROR!!!
}
}
}

问题

标记为“COMPILER ERROR”的行在 .update() 中有问题:

The method update(capture#4-of ? extends Observable) in the type Observer is not applicable for the arguments (E)

因此即使传递给 update()self 参数是 E extends Observable 类型,它也不满足接口(interface)方法签名update(T observable); 其中T extends Observable。这是为什么?我真的希望它们能够兼容。

我可以解决这个问题以满足我的要求吗?

谢谢。

最佳答案

使用导入 io.reactivex.Observable;

代替导入 java.util.Observable;

关于java - 类型安全的通用 Java 观察器编译时错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28653510/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com