Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 类型参数扩展和方法参数不匹配错误_Java_Generics - Fatal编程技术网

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

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

我创建了如下内容:

ConcreteObserver1是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);
接口定义:

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非常感谢。现在我很清楚了。我理解了泛型的概念。现在我想我正在学习有些实用性。非常感谢。