简体   繁体   English

类型参数扩展和方法参数不匹配错误

[英]type parameter extends and method parameter mismatch error

I created something like below: 我创建了如下内容:

ConcreteObserver1 is the subclass of IObserver ConcreteObserver1是IObserver的子类

Interfaces definitions: 接口定义:

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> {

Concrete Subject class containing IObserver 包含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>()); not working. 不工作。

It complains as below 它抱怨如下

The method addObserver(O) in the type ConcreteSubject is not applicable for the arguments (ConcreteObserver1) ConcreteSubject类型的方法addObserver(O)不适用于参数(ConcreteObserver1)

Why ? 为什么呢

I told O extends IObserver<T> in ConcreteSubject type parameter definition, which says O is a sub-type of IObserver which is ConcreteObserver1 我告诉O extends IObserver<T>ConcreteSubject类型参数定义中O extends IObserver<T> ,它说O是IObserver的子类型,即ConcreteObserver1

Why it is complaining. 为什么抱怨。

The type parameter O is defined to be a subtype of IObserver<T> , this is correct. 类型参数O定义为IObserver<T>的子类型,这是正确的。 But it may stand for any subtype. 但是它可能代表任何子类型。 You don't say anywhere that it stands for ConcreteObserver1 . 您不会在任何地方说它代表ConcreteObserver1 It could also stand for ConcreteObserver42 or something else. 它也可以代表ConcreteObserver42或其他名称。

From what you posted so far, it does not seem like you really have to define O as a type parameter of ConcreteSubject . 从您到目前为止发布的内容来看,您似乎并不需要真正将O定义为ConcreteSubject的类型参数。 You could specifically say that ConcreteSubject always uses a ConcreteObserver1 . 您可以明确地说, ConcreteSubject始终使用ConcreteObserver1 If this is not the case, you should probably explain your intention more clearly (and possibly, in a more readable form). 如果不是这种情况,您可能应该更清楚地解释您的意图(并可能以更易读的形式)。

(Edited based on the comments) (根据评论编辑)

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.

相关问题 具有通用参数的方法之间的不匹配类型 - mismatch type between method with a generic parameter 从类型参数扩展 - Extends from type parameter 为什么“类型绑定不匹配:类型? 扩展T不是有界参数的有效替代品 <E extends Enum<E> &gt;枚举类型 <E> “? - Why ”Type Bound mismatch: The type ? extends T is not a valid substitute for the bounded parameter <E extends Enum<E>> of the type Enum<E>“? 边界不匹配:类型A不是边界参数的有效替代品 <T extends Entity> 类型为TestService <T> - Bound mismatch: The type A is not a valid substitute for the bounded parameter <T extends Entity> of the type TestService<T> 有界不匹配:类型不是有界参数的有效替代品<e extends comparable<e> &gt; 类型</e> - Bound mismatch: The type is not a valid substitute for the bounded parameter <E extends Comparable<E>> of the type 绑定不匹配:MyClass1类型不是绑定参数的有效替代品 <T extends Comparator<T> &gt;类型的人 <T> - Bound mismatch: The type MyClass1 is not a valid substitute for the bounded parameter <T extends Comparator<T>> of the type Person<T> Java泛型在类型参数中扩展 - Java generics extends in type parameter 泛型参数扩展了java方法的另一个参数 - Generics parameter extends another parameter on java method 接口类型参数扩展接口? - Interface type parameter extends the interface? Java Generics - 绑定不匹配:类型 Object 不是绑定参数的有效替代品<e extends comparable<e> &gt;</e> - Java Generics - Bound mismatch: The type Object is not a valid substitute for the bounded parameter <E extends Comparable<E>>
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM