Java C#接口协方差,指定参数类型
我一直在努力研究如何在C#(Command是一个函数接口)中获得与以下Java代码等价的代码Java C#接口协方差,指定参数类型,java,c#,covariance,Java,C#,Covariance,我一直在努力研究如何在C#(Command是一个函数接口)中获得与以下Java代码等价的代码 公共接口执行器{ void execute(final C命令)抛出异常; } 按照我的代码目前在Java版本中的设计方式,类型C必须扩展命令,据我所知,它是用C#中的协方差处理的 然而,根据C#docs的说法,像下面这样的东西是行不通的,因为“” 接口执行器 { 无效执行(命令); } 是否有一种方法可以指定方法的参数类型必须与C#中的接口类型相关 我对C#比较陌生,所以这可能是一个XY问题,但到
公共接口执行器{
void execute(final C命令)抛出异常;
}
按照我的代码目前在Java版本中的设计方式,类型C必须扩展命令,据我所知,它是用C#中的协方差处理的
然而,根据C#docs的说法,像下面这样的东西是行不通的,因为“”
接口执行器
{
无效执行(命令);
}
是否有一种方法可以指定方法的参数类型必须与C#中的接口类型相关
我对C#比较陌生,所以这可能是一个XY问题,但到目前为止我还没有找到一个可行的解决方案。我想你想要的是: 因为您只能从
IEnumerable
中提取字符串,所以可以安全地假设它们都是对象。如果允许您将项目放入IEnumerable
,则可以将任何旧对象放入只允许字符串的集合中,这将是不安全的
举个例子,因为您只将命令
放入IExecutor
,所以可以将其声明为逆变:
interface IExecutor<in T> where T : Command
{
void Execute(T command);
}
接口执行器,其中T:Command
{
无效执行(T命令);
}
这会让你写:
IExecutor<Command> baseExecutor = ....;
IExecutor<SpecialisedCommand> executor = baseExecutor;
IExecutor baseExecutor=。。。。;
IExecutor executor=基本执行器;
这是安全的,因为您已经向编译器承诺,IExecutor
上的方法将只接受Command
对象,并且永远不会返回它们。我想您想要的是:
因为您只能从IEnumerable
中提取字符串,所以可以安全地假设它们都是对象。如果允许您将项目放入IEnumerable
,则可以将任何旧对象放入只允许字符串的集合中,这将是不安全的
举个例子,因为您只将命令
放入IExecutor
,所以可以将其声明为逆变:
interface IExecutor<in T> where T : Command
{
void Execute(T command);
}
接口执行器,其中T:Command
{
无效执行(T命令);
}
这会让你写:
IExecutor<Command> baseExecutor = ....;
IExecutor<SpecialisedCommand> executor = baseExecutor;
IExecutor baseExecutor=。。。。;
IExecutor executor=基本执行器;
这是安全的,因为您已经向编译器承诺,IExecutor
上的方法将只接受Command
对象,并且永远不会返回它们。您想要接口IExecutor,其中T:Command{void Execute(T Command);}
?尽管在您的示例中,您可以只执行接口IExecutor{void Execute(Command);}
(注意这不是协方差。接口协方差允许您编写第一个听起来正确的IEnumerable x=new List()
,这有点不同)。使用协方差和使用where
语句之间是否存在有意义的区别?协方差有点不同IEnumerable
被声明为IEnumerable{…}
,它允许您编写例如IEnumerable x=new List()
-即它告诉编译器将列表
引用为任何旧对象的集合是安全的,因为您只能从集合中取出项,而不是把它们放进去。我觉得这有道理吗?不管怎样,你的解决方案看起来就像我想要的。我很乐意接受它作为一个答案。您是否想要接口IExecutor where T:Command{void Execute(T Command);}
?尽管在您的示例中,您可以只执行接口IExecutor{void Execute(Command);}
(注意这不是协方差。接口协方差允许您编写第一个听起来正确的IEnumerable x=new List()
,这有点不同)。使用协方差和使用where
语句之间是否存在有意义的区别?协方差有点不同IEnumerable
被声明为IEnumerable{…}
,它允许您编写例如IEnumerable x=new List()
-即它告诉编译器将列表
引用为任何旧对象的集合是安全的,因为您只能从集合中取出项,而不是把它们放进去。我觉得这有道理吗?不管怎样,你的解决方案看起来就像我想要的。我很乐意接受它,因为协方差是一个面向对象的概念,我知道它不是C#@CoderinoJavarino独有的。这就是为什么我说“C中的协方差”是…-我说的是协方差在C中的含义,具体来说,正如C文档所定义的那样。更新了措辞,希望更清楚。协方差是一个OOP概念,我知道它不是C#@CoderinoJavarino独有的。这就是为什么我说“C中的协方差”是…-我说的是协方差在C中的含义,具体来说,正如C文档所定义的那样。更新了措辞,希望更清楚。