【问题标题】:Are these two Java and C# statements equal?这两个 Java 和 C# 语句是否相等?
【发布时间】:2012-11-21 16:16:23
【问题描述】:

在 C# 中

class ListMap<K, E>
    : ImyMap<K, E>, IComparable<K>, IEnumerable<KeyValuePair<K, E>>
{
}

在 Java 中

class MyListMap<K extends Comparable<? super K>, E>
    implements MyMap<K,E>, Iterable<KeyValuePair<K, E>>
{
}

只是想将一些数据结构从 Java 转换为 C#,并想知道我的 C# 实现是否与我的 Java 相同。

如果不行请指正?

【问题讨论】:

  • 最好在代码审查时问它
  • 这是我个人的东西,这种评论是对整个网站的嘲弄。
  • 但无论如何感谢您的建设性反馈。
  • 这不是嘲讽,因为所有这些网站都由堆栈交换管理所有类型的主题。
  • 我以为你的意思是在我的学校或公司进行代码审查......道歉

标签: c# java .net interface


【解决方案1】:

不,它们不相等。 K extends ... 部分需要翻译成约束:

class ListMap<K, E>
    : ImyMap<K, E>, IEnumerable<KeyValuePair<K, E>>
   where K : IComparable<K>
{
}

通配符 ? super K 在 C# 中不是必需的。通配符是 Java 支持协/逆变的方式。在 C# 中,这是作为接口声明的一部分完成的:

interface IComparable<in K> { ... }

in 修饰符使接口逆变,其效果与 Java 中的通配符相同。

【讨论】:

  • 这就是我想要的,但对此感到担心:我们是否需要调整 K : IComparable&lt;K&gt; 以允许我们拥有 K extends Comparable&lt;? super K&gt; 而不是 K extends Comparable&lt;K&gt; 的事实?
  • 太棒了,这是我在 C# 中一直遇到问题的部分。大多数情况下对它来说有点新,并试图在其中实现我自己的数据结构。
  • 我以前从来没有见过这样的地方,我喜欢互联网谢谢你们!
  • @Rawling:我扩展了我的答案来解释通配符。
  • 啊,方差涵盖了吗?我想知道您是否必须添加一个虚拟类型参数并执行where K : IComparable&lt;SuperK&gt; where K : SuperK
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-31
  • 1970-01-01
  • 1970-01-01
  • 2018-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多