Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.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 C#接口协方差,指定参数类型_Java_C#_Covariance - Fatal编程技术网

Java C#接口协方差,指定参数类型

Java C#接口协方差,指定参数类型,java,c#,covariance,Java,C#,Covariance,我一直在努力研究如何在C#(Command是一个函数接口)中获得与以下Java代码等价的代码 公共接口执行器{ void execute(final C命令)抛出异常; } 按照我的代码目前在Java版本中的设计方式,类型C必须扩展命令,据我所知,它是用C#中的协方差处理的 然而,根据C#docs的说法,像下面这样的东西是行不通的,因为“” 接口执行器 { 无效执行(命令); } 是否有一种方法可以指定方法的参数类型必须与C#中的接口类型相关 我对C#比较陌生,所以这可能是一个XY问题,但到

我一直在努力研究如何在C#(Command是一个函数接口)中获得与以下Java代码等价的代码

公共接口执行器{
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文档所定义的那样。更新了措辞,希望更清楚。