我这里有点问题。我正在使用泛型类,但是在从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>
假设您的
Agent
,LabState
和LabAction
分别实现了IAgent
,IState
和IAction
。但是,如果仅将IAgent
定义为协变,则它仅返回这些类型的值并且从不接受它们。因此,泛型类型应仅显示为方法的返回类型和只读属性的类型。您也可以用基本类代替接口IAction
和IState
,但是协方差运算符out
仅适用于接口。