问题标签 [generic-method]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 类型安全等效于将泛型方法的类型参数约束到给定接口的未封闭类型
在 C# 中是否可以约束泛型方法的类型参数,使其以类型安全的方式限制为接口的未封闭类型?让我详细说明...
例如,我有以下伪代码:
我有几个实现 IValidator 的接口,例如 ICreateValidator 和 IDeleteValidator。我可以很容易地以反射方式收集我想要的验证器,它不像我想要的那样通用,它关闭所有类型 T、T 的所有基类以及由 T 实现的接口。
欲望将能够调用类似的东西
这将为我提供未封闭类型的 IDeleteValidator<> 允许我在内部找到 IDeleteValidaor 的每个实现,其中 T 是具体域对象类型、具体域对象类型实现的接口或递归基类型具体域对象类型一直延伸到对象.
当然我可以关闭域对象上的接口,我应该调用它对我来说没有意义
鉴于我俩都无法保证 TValidator 在编译时将是一个泛型类型,并且除了剥离它的关闭类型之外不会使用显式关闭的 TValidator ,这对我来说似乎是错误的做事方式。
我提供的伪代码显然具有功能,但是是否有一种类型安全的等效于将泛型方法的类型约束为给定接口的未封闭类型?
编辑以更正一些术语
c# - 优化通用方法逻辑
我有一个通用方法,我们可以将 T 作为接口类型传递。方法返回对应T类型的数据列表。对于这种方法,我有 20-25 个相同的条件,我该如何优化逻辑。
类实现接口。示例 Student 类实现 IStudent 接口。
这里调用者传递接口类型 T 并检查 T 的类型。我传递给其他函数 T 和将返回 T 列表的类。基类中的其他函数我无法更改。谁能给我一些相同的建议。
c# - 我可以使用反射中的类型作为类型参数吗?
我可以使用反射中的类型作为类型参数吗?例如,我想根据传递的对象选择一个持久化器:
c# - 具有通用约束的通用方法
我想要做的是有一个将泛型类型作为带有约束的参数的方法。但是,约束的类型也有第二个泛型类型,但我希望该方法能够工作,而不管第二个类型是什么:
具体来说,我试图让我的EventManager
班级接收任何类型的事件,然后对其进行处理。我是不是把事情复杂化了,或者这可行吗?
c# - 返回不同类型时是否建议使用多种方法?
我正在从一个Entity
对象返回值。其中有些是String
打字的,有些不是。现在,我做了一个快速的解决方案,如下所示。
然后我记得有一个通用类型的语法(类似于<TypeX>
)。但是,我的问题是,是否有必要开始更改现有代码。我需要在两个地方(返回类型和替代类型)更改方法的签名,但我担心我还需要在方法内部进行一些复杂的编码。
另一方面,我有一个很好的方法来处理所有可能的类型(我有一种预感,我们将使用的不仅仅是字符串和整数。
java - 调用 Java 泛型方法
我正在研究 Java 泛型特性,但不知道如何解释以下main
方法中的第三行:
第一行编译、运行并返回(如预期的那样)false
。
第二行没有按预期编译,因为我明确混合String
和Long
.
第三行编译、运行并返回 false,但我不确定它是如何工作的:编译器/JVM 是否将参数类型实例T
化为Object
?(另外,有没有办法获得这种声明的T
运行时类型?)
谢谢你。
c# - C# 泛型方法与强制转换
我正在用 C# 编写一个程序(目前为 3.5,但可能会根据需要适应其他版本),它使用简单的插件架构来控制输入和输出。每个插件都是一个 DLL,在用户选择要使用的插件时加载。
由于实际的插件类直到运行时才知道,所以我在包装类中使用反射来调用插件的方法和访问属性。
到目前为止,我一直在使用以下方法调用插件上的方法:
使用如下:
只要调用者正确地将返回值转换为预期的类型,这就会很好地工作。插件必须实现某些接口,所以调用者应该知道这种类型。
然而,在对反射做了一些进一步的工作之后,我想到了以下替代形式:
这个用法如下:
此版本实质上将强制转换移动到 Method 方法中。调用者显然仍然需要知道预期的返回类型,但情况总是如此。它不适用于 void 方法,但我可以为此包含一个 Method 版本:
我的问题是 - 其中一个本质上是否比另一个更好(对于给定的“更好”值)?例如,一个明显更快吗?更容易理解?更支持?
我个人喜欢后者的外观,虽然我有点担心我的返回类型测试 ( Methods[methodName].ReturnType != typeof(T)
) 可能过于简单。有趣的是,它最初是!(Methods[methodName].ReturnType is T)
,但似乎总是失败。
我能找到的与此最接近的现有问题是Generic method to type cast,一些答案表明后一种方法比前者更昂贵,但那里的细节并不多(这个问题更多方法的实现而不是哪个更好)。
澄清:这是一个手动的、非常有限的插件系统,不使用 IPlugin。我对泛型方法本身是否比期望调用者在这种情况下强制转换更感兴趣的问题更感兴趣。
java - 泛型类中的 Java 泛型方法
如果在Java中创建一个泛型类(该类具有泛型类型参数),可以使用泛型方法(该方法采用泛型类型参数)吗?
考虑以下示例:
正如您对泛型方法所期望的那样,我可以调用任何对象doSomething(K)
的实例:MyClass
但是,如果我尝试在MyGenericClass
不指定泛型类型的情况下使用 的实例,我调用会doSomething(K)
返回一个Object
,而不管K
传入的是什么:
奇怪的是,如果返回类型是泛型类,它将编译 - 例如List<K>
(实际上,这可以解释 - 请参阅下面的答案):
此外,如果输入了泛型类,即使只使用通配符,它也会编译:
为什么在无类型的泛型类中调用泛型方法不起作用有充分的理由吗?
是否有一些与我缺少的泛型类和泛型方法相关的巧妙技巧?
编辑:
为了澄清,我希望一个无类型或原始类型的泛型类不尊重泛型类的类型参数(因为它们没有被提供)。但是,我不清楚为什么无类型或原始类型的泛型类意味着泛型方法不被尊重。
事实证明,这个问题已经在 SO 上提出,参见这个问题。对此的答案解释说,当一个类是无类型/原始形式时,所有泛型都会从该类中删除 - 包括泛型方法的类型。
但是,对于为什么会这样,并没有真正的解释。所以请允许我澄清我的问题:
- 为什么 Java 会删除无类型或原始类型泛型类上的泛型方法类型?这有充分的理由,还是只是疏忽?
编辑 - JLS 的讨论:
有人建议(在回答上一个 SO 问题和这个问题时)这是在JLS 4.8中处理的,其中指出:
未从其超类或超接口继承的原始类型 C 的构造函数(第 8.8 节)、实例方法(第 8.4 节、第 9.4 节)或非静态字段(第 8.3 节)的类型是对应的原始类型在对应于 C 的泛型声明中擦除其类型。
我很清楚这与非类型化类有何关系——类泛型类型被擦除类型替换。如果类泛型已绑定,则擦除类型对应于这些边界。如果它们未绑定,则擦除类型为 Object - 例如
虽然泛型方法是实例方法,但我不清楚 JLS 4.8 是否适用于泛型方法。泛型方法的类型(<K>
在前面的示例中)不是无类型的,因为它的类型由方法参数确定 - 只有类是无类型/原始类型的。
c# - 更正通用方法返回值的 XML 注释
我需要为方法登录的返回值创建 XML 注释。此方法返回 Result 的对象类型。如果登录成功,则此对象包含会话 ID,如果登录不成功则包含错误消息。
我不知道如何在 XML 注释中描述这一点。
谢谢你的建议。
java - 泛型方法的问题
我遇到以下情况的问题:
在最后一行,错误是Type mismatch: cannot convert from Pair<String,List<capture#74-of ? extends Object>> to Pair<String,List<? extends Object>>
如何正确定义泛型?
更新:应该可以在调用中使用不同的集合类型function1(Collection<Long>, Collection<String>)