实现一个接口的类是否被认为是该接口的父类?

3
我有一个框架,使用一个对象来维护其他对象之间的状态。我希望与状态交互的对象(“Actions”)可以通用地接受一个接口类型,该接口由State对象实现,但我在尝试实现时遇到了问题。
我想以特定的状态实现(或接口)来定义框架对象本身,并能够向其添加操作,只要它们直接或通过状态实现的接口接受已定义的状态即可。
据我所知,<? super S>的定义意味着“某些类型是S的父类”,但我不确定由S实现的接口是否符合此描述,因为它并不完全是一个父类。
这里是一个示例(不是完全编译的代码):
Class Framework<State> {
    addAction(Action<? super State> a) {} // adds to a list of actions to be run

    run(State s) {
        for(Action<? super State> a : actions) {
            a.perform(s);
        }
    }
}

Interface IState1 {}

Interface IState2 {}

Interface Action<State> {
    public void perform(State s);
}

Class Action1 implements Action<IState1> {}

Class Action2 implements Action<IState2> {}

Class CombinedState implements IState1, IState2 {}

public static void run() {
    Framework<CombinedState> f = new Framework<CombinedState>();

    // add is expecting Action<? super CombinedState> but getting Action<IState1>
    f.add(new Action1()); // This doesn't seem to work
    f.add(new Action2());

    f.run(new CombinedState());
}

在泛型中,接口是否算作父类?有没有不需要反射就能实现的方法?


你想接受从State接口扩展的对象吗? - Sednus
我想接受能够使用CombinedState的Actions,无论是直接使用还是因为CombinedState实现了它们接受的接口。 - Bracket
2
好的,如果你:1)用小写字母开头编写了“class”和“interface”;2)类“Framework”有一个“add()”方法(实际上是“addAction()”),那么你的代码将会编译。 - Natix
这段代码中的State是什么?这就像说T一样,还是State是在某个地方定义的接口?请提供实际代码。 - Cratylus
这就像是说'T',但是更具有描述性的类型变量名称。@Natix:结果就是这个问题 :) - Bracket
回答你的问题:是的,一个接口是实现它的类的超类型。 - Natix
1个回答

0
import java.util.ArrayList;

class State{}

class Framework<State> 
{
    public ArrayList< Action< ? super State > >actions = new ArrayList< Action< ?super State > >();

    void add(Action<? super State> a) {

        actions.add(a);

    } 

    void doRun(State s) {
        for(Action<? super State> a : actions) {
            a.perform(s);
        }
    }
}

interface IState1 {}

interface IState2 {}

interface Action<State> {
    public void perform(State s);
}

class Action1 implements Action<IState1> {
    public void perform( IState1 s )
    {
        System.out.println("Do something 1");
    }
}

class Action2 implements Action<IState2> {

    public void perform( IState2 s )
    {
        System.out.println("Do something 2");
    }   
}

class CombinedState implements IState1, IState2 {}

class Untitled {
    public static void main(String[] args) 
    {
         Framework<CombinedState> f = new Framework<CombinedState>();

            // add is expecting Action<? super CombinedState> but getting Action<IState1>
            f.add(new Action1()); // This doesn't seem to work
            f.add(new Action2());

            f.doRun(new CombinedState());
    }
}

这可以在OSX上的CodeRunner中运行。


你把State定义为一个类,这样做有必要吗? - Bracket
@Bracket:我也认为这不是必要的。在 Framework<State> 中,State 只是一个类型参数(与 T 相同)。 - Natix
哦,我感觉好蠢。在我的代码中,我使用的是"add"而不是我实际定义的"addAction"。现在我感到很尴尬,因为我为了一个简单的拼写错误走了这么远。但是看到它对你起作用让我意识到了我的错误! - Bracket

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接