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