Java 类型参数扩展和方法参数不匹配错误
我创建了如下内容: ConcreteObserver1是IObserver的子类Java 类型参数扩展和方法参数不匹配错误,java,generics,Java,Generics,我创建了如下内容: ConcreteObserver1是IObserver的子类 public class ConcreteSubject<T, O extends IObserver<T>> implements ISubject<T,O> { public ConcreteSubject() { addObserver(new ConcreteObserver1<T>()); } Co
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);
接口定义:
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> {
公共接口是主体{
公众观察员(O名观察员);
消除公共无效观察员(O观察员);
public void updateAllSubjects(T值);
}
公共接口IObserver{
公共无效更新(T值);
}
公共类ConcreteObserver1实现IObserver{
包含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);
公共类ConcreteSubject实现
主体{
公共学科(){
addObserver(新的ConcreteObserver1());
}
ConcurrentSkipListSet-ObserverList=新的ConcurrentSkipListSet();
公共观察者(O观察者){
observer列表添加(observer);
addObserver(新的ConcreteObserver1());
不工作
它的投诉如下
类型ConcreteSubject中的方法addObserver(O)不适用于参数(ConcreteObserver1)
为什么?
我在ConcreteSubject
类型参数定义中告诉了O扩展了IObserver
,表示O是IObserver的子类型,即concreteobserver 1
它为什么抱怨。类型参数
O
被定义为IObserver
的一个子类型,这是正确的。但它可能代表任何子类型。你不会说它代表concreteobserver 1
。它也可能代表concreteobserver 42
或其他什么
从您目前发布的内容来看,似乎并不需要将O
定义为ConcreteSubject
的类型参数。您可以明确地说ConcreteSubject
始终使用ConcreteObserver1
。如果不是这样,您可能应该更清楚地解释您的意图(并且可能以更可读的形式)
(根据评论编辑)
接口是主体
{
观察员(O名观察员);
无效移除观察员(O观察员);
void updateAllSubjects(T值);
}
接口IObserver
{
无效更新(T值);
}
类ConcreteObserver1实现IObserver
{
@凌驾
公共无效更新(T值){}
}
类ConcreteObserver2实现IObserver
{
@凌驾
公共无效更新(T值){}
}
类ConcreteObserver3实现IObserver
{
@凌驾
公共无效更新(T值){}
}
类ConcreteSubject实现IsSubject
{
ConcurrentSkipListSet观察者列表=
新的ConcurrentSkipListSet();
公共学科()
{
addObserver(新的ConcreteObserver1());
addObserver(新的ConcreteObserver2());
addObserver(新的ConcreteObserver3());
}
@凌驾
public void addObserver(IObserver observer)
{
observer列表添加(observer);
}
@凌驾
public void removeObserver(IObserver观察者)
{
observer列表。删除(observer);
}
@凌驾
public void updateAllSubjects(T值)
{
for(IObserver观察员:observer列表)
{
观察员:更新(价值);
}
}
}
为什么在一个接口中有一个类/上面的代码中有什么错误?什么是ISubject
?在IObserver
中有什么?当IObserver
是一个接口时,你如何编写1extends IObserver`呢?我的意图是使用concreteobserver 1,2,3…所以,我想使用addObserver方法,它可以接受任何concreteobserverver1,2,3…就像你的情况一样,如果我想用像addObserver(new ConcreteObserver2())这样的参数调用,我该怎么做。你的观点对ConcurrentSkipListSet ObserverList=new ConcurrentSkipListSet();很有帮助;因为我不知道我放的是哪个ConcreteObserver,但为什么要用参数签名(O observer)无法容纳ConcreteObserver类型的对象。嗨,marco,我想从你的回答中问另一件事,这意味着类ConcreteSubject在接口定义中实现了IsSubject,你说它容纳两种类型的对象,一种是类型T,另一种是ConcreteObserver1,在类类型参数定义中你说只有ConcreteSubject,为什么没有任何理由。我的意思是为什么不这样做会有任何区别。ConcreteSubject实现了IsSubject。我想学习如何定义接口泛型类型和具体类泛型类型。@bhadram然后阅读。@bhadram添加了一个EDIT@Marco非常感谢。现在我很清楚了。我理解了泛型的概念。现在我想我正在学习有些实用性。非常感谢。