gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 13:11:25 27 4
gpt4 key购买 nike

我创建了如下所示的内容:

ConcreteObserver1是IObserver的子类

接口(interface)定义:

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 的具体主题类

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 是 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);
}
}
}

关于java - 类型参数扩展和方法参数不匹配错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22835111/

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