- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
首先我要说我是一名学习使用 C# 编程的 Java 开发人员。因此,我将我所知道的与我正在学习的进行比较。
我已经玩 C# 泛型几个小时了,我已经能够在 C# 中重现我在 Java 中知道的相同内容,除了几个使用协变和逆变的示例。我正在读的这本书在主题上不是很好。我当然会在网上寻找更多信息,但在我这样做的同时,也许您可以帮我找到以下 Java 代码的 C# 实现。
一个例子胜过一千个单词,我希望通过查看好的代码示例,我能够更快地理解这一点。
协方差
在 Java 中我可以这样做:
public static double sum(List<? extends Number> numbers) {
double summation = 0.0;
for(Number number : numbers){
summation += number.doubleValue();
}
return summation;
}
我可以按如下方式使用此代码:
List<Integer> myInts = asList(1,2,3,4,5);
List<Double> myDoubles = asList(3.14, 5.5, 78.9);
List<Long> myLongs = asList(1L, 2L, 3L);
double result = 0.0;
result = sum(myInts);
result = sum(myDoubles)
result = sum(myLongs);
现在我确实发现 C# 仅在接口(interface)上支持协变/逆变,只要它们已明确声明这样做(输出/输入)。我想我无法重现这种情况,因为我找不到所有数字的共同祖先,但我相信如果存在共同祖先,我可以使用 IEnumerable 来实现这样的事情。由于 IEnumerable 是协变类型。对吧?
关于如何实现上面的列表有什么想法吗?只要指出我正确的方向。所有数字类型都有共同的祖先吗?
逆变
我试过的逆变例如下。在 Java 中,我可以这样做以将一个列表复制到另一个列表中。
public static void copy(List<? extends Number> source, List<? super Number> destiny){
for(Number number : source) {
destiny.add(number);
}
}
然后我可以将它与逆变类型一起使用,如下所示:
List<Object> anything = new ArrayList<Object>();
List<Integer> myInts = asList(1,2,3,4,5);
copy(myInts, anything);
我的基本问题是,尝试在 C# 中实现它是我找不到同时协变和逆变的接口(interface),就像我上面示例中的 List 的情况一样。也许可以使用 C# 中的两个不同接口(interface)来完成。
关于如何实现这个的任何想法?
非常感谢大家提供的任何答案。我很确定我会从您提供的任何示例中学到很多东西。
最佳答案
我不会直接回答您的问题,而是会回答一些稍微不同的问题:
Does C# have a way to genericize over types that support arithmetic operators?
不容易,不。如果有能力制作 Sum<T>
就好了可以添加整数、 double 、矩阵、复数、四元数等的方法。尽管这是一个相当频繁被请求的特性,但它也是一个重要特性,而且它在优先级列表中的优先级还没有高到足以证明将其包含在该语言中是合理的。我个人会喜欢它,但你不应该期望它出现在 C# 5 中。也许在该语言的一个假设的 future 版本中。
What is the difference between Java's "call site" covariance/contravariance and C#'s "declaration site" covariance/contravariance?
实现级别的根本区别当然是,作为一个实际问题,Java 泛型是通过删除实现的;尽管您获得了泛型类型的令人愉快的语法和编译时类型检查的好处,但您不一定获得在 C# 中会获得的性能优势或运行时类型系统集成优势。
但这实际上更像是一个实现细节。在我看来,更有趣的区别是 Java 的变化规则是本地强制执行的,而 C# 的变化规则是全局执行的。
也就是说:某些变体转换是危险的,因为它们意味着某些类型不安全的操作不会被编译器捕获。经典的例子是:
这显然违反了类型安全以及长颈鹿的安全。
C# 和 Java 使用两种不同的技术来防止这种类型安全违规。 C# 表示当 I<T>
接口(interface)被声明,如果它被声明为协变的,那么必须没有接受 T 的接口(interface)方法。如果没有将 T 插入列表的方法,那么您永远不会将长颈鹿插入老虎列表,因为没有插入任何东西的方法。
相比之下,Java 说在这个本地站点,我们可以协变地处理类型,并且我们保证不会在这里调用任何可能违反类型安全的方法。
我对 Java 的功能没有足够的经验来判断在什么情况下哪个“更好”。 Java 技术当然很有趣。
关于c# - C# 中的协变和逆变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9806170/
要在 R 中绘制正态分布曲线,我们可以使用: (x = seq(-4,4, length=100)) y = dnorm(x) plot(x, y) 如 dnorm将 y 计算为 x 的函数,R 是否
@XmlTransient 阻止将 JavaBeans 属性映射到 XML 表示。是否存在与此相反的情况,这意味着即使 WebService 未使用的方法也会被映射?如果这不可能,是否存在解决方法?
我有以下键数组: var keys = [{userId: "333"}, {userId: "334"}] 这个对象数组: var users = [ {id: "333", firstName:
我正在寻找将字符串转换为类型的通用方法。 例如: class SomeThing { public void Add(T value) { //... } pub
我看到了this question , 并弹出这个想法。 有没有一种在 PHP 中执行此操作的有效方法? 编辑 有演示最好吗? 最佳答案 你可以使用 pear 包 Math_Matrix为此。 关于矩
如何在 python 中求逆矩阵?我自己实现了它,但它是纯 python,我怀疑那里有更快的模块可以做到这一点。 最佳答案 你应该看看 numpy如果您进行矩阵操作。这是一个主要用C语言编写的模块,比
是否有比使用 IF ELSE 构造更简单的方法来反转 bool 值? 通常我会使用! bool 值前面。但这在 Navision 中不起作用 最佳答案 您可以使用 NOT 关键字代替 !。 关于nav
假设我有一个对象响应。现在我想检查一个 bool 变量,success,在 Response 下并做一个早期返回是 response 不成功。 if(response == null || !resp
任何人都可以提供/引用多维行主要顺序的“索引->偏移”*转换的倒数。此外,(伪)代码将不胜感激。 http://en.wikipedia.org/wiki/Row-major_order 举个例子,简
我有一个看起来像这样的系统: z1 = 5*x1 + x2*cos(x3) z2 = x1*sin(x3) + 3*x2 z3 = 3*x1 - 2*x2 这是微分方程组的变换(只是为了提供一些背景信
我正在使用org.apache.commons.math3.transform类FastFourierTransformer,我现在尝试在真实数据集上应用FFT,并应用逆FFT来获取原始数据集。我的问
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 9 年前。 Improve
背景 我需要使用已知的累积分布函数 (CDF) 从相当复杂的概率密度函数 (PDF) 中随机采样,并且我正在尝试使用 inverse transform sampling 。这应该很容易做到,因为我有
是否有任何 System.identityHashCode (object) 的逆函数能够从 System.identityHashCode (object) 的结果中提供对象的值? 最佳答案 Sys
有没有办法在mysql中获取group by语句的逆?我的用例是删除所有重复项。 假设我的表格如下所示: ID | columnA | ... 1 | A 2 | A 3 | A 4
我有一个查询,它给我一个公司列表(tblprov)及其相应的类别(tblrubro) 两个表通过查找表 (tblprovxrubro) 相关 SELECT p.id, p.name, r.idCat,
我有一个 jpg 图像,在矩形中有一个圆形物体,我想使圆形物体的环境透明... (本例去除红色区域) 借助这个iOS make part of an UIImage transparent和“UIBe
我想知道是否可以在不需要临时数组的情况下通过 Cholesky 分解获得矩阵的逆。截至目前,我可以在不使用临时数组的情况下进行 cholesky 分解,但从那里我还没有想出一种方法来获得原始矩阵的逆矩
是否可以在 Angular 中使用逆$watch? 我的问题 我使用 Angular-translate,并且我想对每个缺少的翻译使用 $http.put 。但我收到此错误: "10 $digets(
我正在执行 radix-2 dif 逆 fft。我正在使用共轭和缩放的属性来返回结果。我共轭我的输入 vector ,执行常规 radix-2 fft(不是 ifft),共轭结果,然后按 1.0/N
我是一名优秀的程序员,十分优秀!