[英]type parameter extends and method parameter mismatch error
我創建了如下內容:
ConcreteObserver1是IObserver的子類
接口定義:
public interface ISubject<T,O extends IObserver<T>> {
public void addObserver(O observer);
public void removeObserver(O observer);
public void updateAllSubjects(T value);
}
public interface IObserver<T> {
public void update(T value);
}
public class ConcreteObserver1<T> implements IObserver<T> {
包含IObserver的具體Subject類
public class ConcreteSubject<T, O extends IObserver<T>> implements
ISubject<T,O> {
public ConcreteSubject() {
addObserver(new ConcreteObserver1<T>());
}
ConcurrentSkipListSet<O> observersList = new ConcurrentSkipListSet<O>();
public void addObserver(O observer) {
observersList.add(observer);
addObserver(new ConcreteObserver1<T>());
不工作。
它抱怨如下
ConcreteSubject類型的方法addObserver(O)不適用於參數(ConcreteObserver1)
為什么呢
我告訴O extends IObserver<T>
在ConcreteSubject
類型參數定義中O extends IObserver<T>
,它說O是IObserver的子類型,即ConcreteObserver1
為什么抱怨。
類型參數O
定義為IObserver<T>
的子類型,這是正確的。 但是它可能代表任何子類型。 您不會在任何地方說它代表ConcreteObserver1
。 它也可以代表ConcreteObserver42
或其他名稱。
從您到目前為止發布的內容來看,您似乎並不需要真正將O
定義為ConcreteSubject
的類型參數。 您可以明確地說, ConcreteSubject
始終使用ConcreteObserver1
。 如果不是這種情況,您可能應該更清楚地解釋您的意圖(並可能以更易讀的形式)。
(根據評論編輯)
interface ISubject<T,O extends IObserver<T>>
{
void addObserver(O observer);
void removeObserver(O observer);
void updateAllSubjects(T value);
}
interface IObserver<T>
{
void update(T value);
}
class ConcreteObserver1<T> implements IObserver<T>
{
@Override
public void update(T value) {}
}
class ConcreteObserver2<T> implements IObserver<T>
{
@Override
public void update(T value) {}
}
class ConcreteObserver3<T> implements IObserver<T>
{
@Override
public void update(T value) {}
}
class ConcreteSubject<T> implements ISubject<T,IObserver<T>>
{
ConcurrentSkipListSet<IObserver<T>> observersList =
new ConcurrentSkipListSet<IObserver<T>>();
public ConcreteSubject()
{
addObserver(new ConcreteObserver1<T>());
addObserver(new ConcreteObserver2<T>());
addObserver(new ConcreteObserver3<T>());
}
@Override
public void addObserver(IObserver<T> observer)
{
observersList.add(observer);
}
@Override
public void removeObserver(IObserver<T> observer)
{
observersList.remove(observer);
}
@Override
public void updateAllSubjects(T value)
{
for (IObserver<T> observer : observersList)
{
observer.update(value);
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.