我这里有点问题。我正在使用泛型类,但是在从UI面板进行选择之前我不知道类型。在知道对象的类型之前,如何声明它?
所以这是样本

public class UI
{
    Agent myAgent;
    public UI()
    {
    }
    public void Initialize()
    {
        if (textBox1.Text == "LabAgent")
            myAgent = new Agent<LabState, LabAction>();
        else
            myAgent = new Agent<FieldState, FieldAction>();
    }
}


Agent类是一个简单的通用类。我该如何做这样的事,但要切实起作用?如何在不知道类型的情况下定义myAgent?
注意:我使用C#,而不是Java。
编辑1:

public class Agent<S,A>
    where S : AState
    where A : AAction
{
    private List<S> states;
    private List<A> actions;

    private Dictionary<KeyValuePair<S, A>, float> Q;

    private S stareCurenta;

    public void Initializare()
    {
        foreach (S s in states)
        {
            foreach (A a in actions)
            {
                Q.Add(new KeyValuePair<S, A>(s, a), 32000);
            }
        }
    }
}

最佳答案

看来您想使用协方差。为了做到这一点,首先需要一个Agent将要实现的接口,我们称之为IAgent。然后,您需要定义该接口,例如

public interface IAgent<out TState, out TAction>
    where TState : IState
    where TAction : IAction


那你可以做

IAgent<IState, IAction> agent = new Agent<LabState, LabAction>


假设您的AgentLabStateLabAction分别实现了IAgentIStateIAction。但是,如果仅将IAgent定义为协变,则它仅返回这些类型的值并且从不接受它们。因此,泛型类型应仅显示为方法的返回类型和只读属性的类型。您也可以用基本类代替接口IActionIState,但是协方差运算符out仅适用于接口。

10-04 13:22