簡體   English   中英

類型參數擴展和方法參數不匹配錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM