.NET 相当于 Java 有界通配符 (IInterf)?

2024-02-17

我一直在尝试将一些使用(有界)通配符泛型的 Java 代码转换为 C#。我的问题是,Java 似乎允许泛型类型与通配符一起使用时既可以是协变的,也可以是逆变的。

[这是前作的衍生作品question https://stackoverflow.com/q/14277441/11545处理更简单的有界通配符情况]

Java- 作品:

class Impl { }

interface IGeneric1<T extends Impl> {
    void method1(IGeneric2<?> val);
    T method1WithParam(T val);
}

interface IGeneric2<T extends Impl> {
    void method2(IGeneric1<?> val);
}

abstract class Generic2<T extends Impl> implements IGeneric2<T> {

    // !! field using wildcard 
    protected IGeneric1<?> elem;

    public void method2(IGeneric1<?> val1) {
        val1.method1(this);

        //assignment from wildcard to wildcard
        elem = val1;
    }
}

abstract class Generic<T extends Impl> implements IGeneric1<T>, IGeneric2<T> {

    public void method1(IGeneric2<?> val2) {
        val2.method2(this);
    }
}

C#- 无法编译...

class Impl { }

interface IGeneric1<T> where T:Impl {
  //in Java:
  //void method1(IGeneric2<?> val);
    void method1<U>(IGeneric2<U> val) where U : Impl; //see this Q for 'why'
                                 // https://stackoverflow.com/a/14277742/11545

    T method1WithParam(T to);
}

interface IGeneric2<T>where T:Impl {
    void method2<U>(IGeneric1<U> val) where U : Impl;
}

abstract class Generic2<T, TU>: IGeneric2<T> //added new type TU
    where T : Impl
    where TU : Impl
{
  //in Java:
  //protected IGeneric1<?> elem;
    protected IGeneric1<TU> elem;

  //in Java:
  //public void method2(IGeneric1<?> val1) 
    public void method2<U>(IGeneric1<U> val) 
        where U : TU //using TU as constraint
    {
        elem = val;  //Cannot convert source type 'IGeneric1<U>' 
                     //to target type 'IGeneric1<TU>'
    }
    public abstract void method1WithParam(T to);
}

abstract class Generic<T> : IGeneric1<T>, IGeneric2<T> where T : Impl
{
  //in Java:
  //public void method1(IGeneric2<?> val2) 
    public void method1<U>(IGeneric2<U> val2) where U : Impl
    {
         val2.method2(this);
    }

    public abstract T method1WithParam(T to);
    public abstract void method2<U>(IGeneric1<U> val) where U : Impl;
    public abstract void nonGenericMethod();
}

如果我改变interface IGeneric1<T> to interface IGeneric1<out T>上面的错误消失了,但是method1WithParam(T)抱怨差异:

Parameter must be input-safe. Invalid variance: The type parameter 'T' must be
contravariantly valid on 'IGeneric1<out T>'.

首先我要说的是,设计审查显然已经开始按顺序进行了。原始的Java类聚合了一个IGeneric1<?>成员,但如果不知道其类型参数,则无法调用method1WithParam以类型安全的方式对其进行处理。

这意味着elem只能用来调用它的method1成员,其签名不依赖于类型参数IGeneric1。它遵循method1可以分解为非通用接口:

// C# code:
interface INotGeneric1 {
    void method1<T>(IGeneric2<T> val) where T : Impl;
}

interface IGeneric1<T> : INotGeneric1 where T : Impl {
    T method1WithParam(T to);
}

在这之后,class Generic2可以聚合一个INotGeneric1改为成员:

abstract class Generic2<T>: IGeneric2<T> where T : Impl
{
    protected INotGeneric1 elem;

    // It's highly likely that you would want to change the type of val
    // to INotGeneric1 as well, there's no obvious reason to require an
    // IGeneric1<U>
    public void method2<U>(IGeneric1<U> val) where U : Impl
    {
        elem = val; // this is now OK
    }
}

当然现在你不能打电话elem.method1WithParam除非您诉诸强制转换或反射,即使已知存在这样的方法并且它对于某些未知类型是通用的X作为类型参数。然而,这与 Java 代码具有相同的限制;只是 C# 编译器不会接受此代码,而 Java 只会在您尝试调用时抱怨method1WithParam1.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.NET 相当于 Java 有界通配符 (IInterf)? 的相关文章

  • 如何计算最低系统要求?

    对于我用 Visual C 编写的应用程序 Testing 不 真的 这就是全部
  • Android:捕获的图像未显示在图库中(媒体扫描仪意图不起作用)

    我遇到以下问题 我正在开发一个应用程序 用户可以在其中拍照 附加到帖子中 并将图片保存到外部存储中 我希望这张照片也显示在图片库中 并且我正在使用媒体扫描仪意图 但它似乎不起作用 我在编写代码时遵循官方的Android开发人员指南 所以我不
  • 是否可以在 IIS7 Express 中使用自定义主机标头/绑定?

    我正在尝试配置一个新的ASP NET MVC3 using IIS7快递 在我的本地开发机器上 使用自定义域名 eg 我的本地开发机器 打开我的网络浏览器 goto http dev www mydomain com http dev ww
  • 列出jshell中所有活动的方法

    是否有任何命令可以打印当前 jshell 会话中所有新创建的方法 类似的东西 list但仅适用于方法 您正在寻找命令 methods all 它会打印所有方法 包括启动 JShell 时添加的方法 以及失败 被覆盖或删除的方法 对于您声明的
  • Spring @RequestMapping 带有可选参数

    我的控制器在请求映射中存在可选参数的问题 请查看下面的控制器 GetMapping produces MediaType APPLICATION JSON VALUE public ResponseEntity
  • 如何在PreferenceActivity中添加工具栏

    我已经使用首选项创建了应用程序设置 但我注意到 我的 PreferenceActivity 中没有工具栏 如何将工具栏添加到我的 PreferenceActivity 中 My code 我的 pref xml
  • 为什么两个不同的 Base64 字符串的转换会返回相等的字节数组?

    我想知道为什么从 base64 字符串转换会为不同的字符串返回相同的字节数组 const string s1 dg const string s2 dq byte a1 Convert FromBase64String s1 byte a2
  • 从 127.0.0.1 到 2130706433,然后再返回

    使用标准 Java 库 从 IPV4 地址的点分字符串表示形式获取的最快方法是什么 127 0 0 1 到等效的整数表示 2130706433 相应地 反转所述操作的最快方法是什么 从整数开始2130706433到字符串表示形式 127 0
  • Java TestNG 与跨多个测试的数据驱动测试

    我正在电子商务平台中测试一系列商店 每个商店都有一系列属性 我正在考虑对其进行自动化测试 是否有可能有一个数据提供者在整个测试套件中提供数据 而不仅仅是 TestNG 中的测试 我尝试不使用 testNG xml 文件作为机制 因为这些属性
  • 在两个活动之间传输数据[重复]

    这个问题在这里已经有答案了 我正在尝试在两个不同的活动之间发送和接收数据 我在这个网站上看到了一些其他问题 但没有任何问题涉及保留头等舱的状态 例如 如果我想从 A 类发送一个整数 X 到 B 类 然后对整数 X 进行一些操作 然后将其发送
  • getResourceAsStream() 可以找到 jar 文件之外的文件吗?

    我正在开发一个应用程序 该应用程序使用一个加载配置文件的库 InputStream in getClass getResourceAsStream resource 然后我的应用程序打包在一个 jar文件 如果resource是在里面 ja
  • 加密 JBoss 配置中的敏感信息

    JBoss 中的标准数据源配置要求数据库用户的用户名和密码位于 xxx ds xml 文件中 如果我将数据源定义为 c3p0 mbean 我会遇到同样的问题 是否有标准方法来加密用户和密码 保存密钥的好地方是什么 这当然也与 tomcat
  • 如何在 javadoc 中使用“<”和“>”而不进行格式化?

    如果我写
  • Eclipse Java 远程调试器通过 VPN 速度极慢

    我有时被迫离开办公室工作 这意味着我需要通过 VPN 进入我的实验室 我注意到在这种情况下使用 Eclipse 进行远程调试速度非常慢 速度慢到调试器需要 5 7 分钟才能连接到远程 jvm 连接后 每次单步执行断点 行可能需要 20 30
  • 垃圾收集器是否在单独的进程中运行?

    垃圾收集器是否在单独的进程中启动 例如 如果我们尝试测量某段代码所花费的进程时间 并且在此期间垃圾收集器开始收集 它会在新进程上启动还是在同一进程中启动 它的工作原理如下吗 Code Process 1 gt Garbage Collect
  • Java列表的线程安全

    我有一个列表 它将在线程安全上下文或非线程安全上下文中使用 究竟会是哪一个 无法提前确定 在这种特殊情况下 每当列表进入非线程安全上下文时 我都会使用它来包装它 Collections synchronizedList 但如果不进入非线程安
  • 如何从泛型类调用静态方法?

    我有一个包含静态创建方法的类 public class TestClass public static
  • 声明的包“”与预期的包不匹配

    我可以编译并运行我的代码 但 VSCode 中始终显示错误 早些时候有一个弹出窗口 我不记得是什么了 我点击了 全局应用 从那以后一直是这样 Output is there but so is the error The declared
  • 获取 JVM 上所有引导类的列表?

    有一种方法叫做findBootstrapClass对于一个类加载器 如果它是引导的 则返回一个类 有没有办法找到类已经加载了 您可以尝试首先通过例如获取引导类加载器呼叫 ClassLoader bootstrapLoader ClassLo
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写

随机推荐

  • ASP.NET MVC 剃刀视图,发布到与原始模型绑定不同的模型?

    好吧 我在项目中有一个组控制器和视图 其中模型绑定是 GroupViewModel 但群组页面比较复杂 用户可以提出讨论话题 在此组视图页面上 我有允许用户发布主题 回复的表单 这些表单使用的模型可以是 TopicViewModel 或 R
  • 如何控制jquery动画速度

    我正在使用 jquery 为 div 制作动画 我想控制移动的速度 我玩了很多这个 但我希望有人能告诉我如何控制速度 这是代码示例 document ready function block css left 617px top 300px
  • 如何单独渲染媒体库项目?

    如何使用 Sitecore 控件在子布局中渲染媒体库项目图像 对于具有 图像 字段的普通内容项来说 这是小菜一碟 只需使用sc Image or FieldRenderer控制 但我有这样的事情
  • 禁止通过构造函数将右值绑定到成员 const 引用

    我正在研究一个矩阵视图类 其构造函数将矩阵作为参数并将其绑定到const参考会员 我非常希望避免绑定右值 因为它们不通过构造函数参数绑定 并且我们最终会得到一个悬空引用 我想出了以下内容 简化的代码 struct Foo class X c
  • MySQL CASE WHEN THEN 空 case 值

    SELECT CASE WHEN age IS NULL THEN Unspecified WHEN age lt 18 THEN lt 18 WHEN age gt 18 AND age lt 24 THEN 18 24 WHEN age
  • 如何检查R中整个向量是否没有除NA(或NAN)以外的值?

    如何检查 R 中整个向量是否没有除 NA 或 NAN 以外的值 如果我使用 is na 它会返回一个 TRUE FALSE 向量 我需要检查是否存在单个非 NA 元素 功能all 当传递一个布尔向量时 会告诉你其中的所有值是否都是TRUE
  • Jquery 移动更改页面后退按钮不起作用

    我的 JQM 主 HTML 文件中有 4 个页面 当我使用 Changepage 切换到一个时 第一次没问题 但我使用 data rel back 按钮返回 这切换到上一页 但然后弹回到具有后退按钮的页面 我应该不使用 data rel b
  • 如何修复 Cloud Foundry 上的“资源文件模式无效”

    我正在尝试使用 Cloud Foundry 将应用程序部署到 Bluemix 并得到以下输出 the neutral zone KituraTest loganwright cf push Using manifest file Users
  • Linq 查询字典,其中列表中的值

    我有一个Dictionary
  • 获取并显示 Woocommerce 3 中的可变产品价格范围

    我对 wordpress 和 woocommerce 很陌生 我正在修改二十七个主题的搜索结果页面 使其看起来像一个表格 大多数产品都是可变产品 我使用下面的代码在表格中显示结果 table class search res style w
  • Eclipse Java 项目文件夹组织

    我是从 C Visual Studio 背景转向 Java 和 Eclipse 的 对于后者 我通常会组织这样的解决方案 MyProjects MyApp MyAppsUtilities LowerLevelStuff 其中 MyApp 将
  • 如何在 PHP 中提取属性声明的起始行?

    通过反射 很容易获得起始线和结束线 例如源文件中的方法 ReflectionFunctionAbstract getFileName ReflectionFunctionAbstract getStartLine ReflectionFun
  • 国际化简单 PHP 网站的最佳方式

    我必须开发一个非常简单的 php 网站 所以我不需要框架 但它必须支持多语言 EN FR CHINESE 我寻找了 php 内置系统 发现了两种方法 php5 3 的 intl 模块 http php net manual fr book
  • 使用逻辑应用在无服务器 Azure Functions 上按顺序消息处理

    我需要在 Azure 上处理传入消息 每条消息都将与一个特定的实体相关联 例如 通过EntityId属性 属于同一实体的消息必须按彼此的顺序进行处理 同时 我会保留 Azure Functions 的无服务器特性 如果我有 1 000 个实
  • 升级到 Struts 2.3.15 - 约定插件导致启动时崩溃

    我正在将 Struts2 安装升级到 2 3 15 添加后struts2 convention plugin 2 3 15 jar我的网络应用程序无法启动 例外列表的相关部分是 Caused by Attribute order must
  • 如何检测iPad用户点击键盘隐藏按钮?

    在我的应用程序中 我有一些围绕键盘隐藏和显示的复杂逻辑 我有兴趣检测用户 拥有 iPad 何时专门点击 iPad 键盘隐藏按钮 I am not仅当用户实际点击此按钮时 才有兴趣检测键盘何时应该隐藏 有什么建议么 谢谢你 我一直在寻找完全相
  • 运行 ansible playbook 时如何缩小范围?

    我有一个剧本需要花费很多时间来执行 部分原因是它必须在很多节点上运行 我在 ansible 检查所有节点的状态上浪费了时间 并且我需要做一些中间某个地方发生了变化 缩小剧本范围的最佳方式是什么 我考虑过隔离所需的更改和 或仅在单个节点上运行
  • 使用 Cucumber 测试 EventMachine

    我正在尝试为我的应用程序编写一个黄瓜功能和 rspec 测试 以使用 twitter stream 访问 twitter 流 api 我有以下代码 Then I should see the latest d tweets from my
  • Spark Metrics:如何访问执行器和工作器数据?

    注意 我在 YARN 上使用 Spark 我一直在尝试公制 https spark apache org docs latest monitoring html metrics在 Spark 中实现 我启用了 ConsoleSink 和 C
  • .NET 相当于 Java 有界通配符 (IInterf)?

    我一直在尝试将一些使用 有界 通配符泛型的 Java 代码转换为 C 我的问题是 Java 似乎允许泛型类型与通配符一起使用时既可以是协变的 也可以是逆变的 这是前作的衍生作品question https stackoverflow com