问题标签 [generics]

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.

0 投票
3 回答
107 浏览

.net - 我应该如何处理需要存储多个不相关类型但按需提供特定类型的情况?

我正在为我们使用的重要内部测试工具使用的文件开发一个编辑器。该工具本身又大又复杂,重构或重写所占用的资源比我们在可预见的未来所能投入的资源还要多,所以当涉及到大的修改时,我的双手束手无策。我必须使用 .NET 语言。

这些文件是工具使用的四个类的 XML 序列化版本(我们称它们为 A、B、C 和 D)。当一切正常时,这些类形成一个树结构。我们的编辑器通过加载一组文件、反序列化它们、计算它们之间的关系以及跟踪它可以找到的任何不良状态来工作。这个想法是让我们摆脱手动编辑这些文件,这会引入大量错误。

对于特定类型的错误,我想维护所有有问题的文件的集合。所有四个类都可能有问题,我想尽可能减少代码重复。一个重要的要求是用户需要能够获得成套的物品;例如,他们需要获取所有有错误的 A 对象,并告诉他们遍历整个集合并挑选出他们想要的东西与GetAs()方法相比是不可接受的。所以,我的第一个想法是制作一个与反序列化对象和一些元数据相关的通用项目以指示错误:

然后,我将有一个可以保存所有错误项的集合类,并使用辅助方法在用户需要时提取特定类的项。这就是麻烦开始的地方。

没有一个类继承自一个共同的祖先(除了Object)。这可能是最初设计的一个错误,但我花了几天时间思考它,除了唯一标识每个项目的 GUID 属性之外,这些类确实没有太多共同点,所以我可以明白为什么最初的设计师没有通过继承将它们联系起来。这意味着统一的错误集合需要存储ErrorItem<Object>对象,因为我没有基类或接口来限制进来的内容。但是,这让这个统一集合的想法对我来说有点粗略:

但是,这会对公共接口产生影响。我真正想要的是返回适当的ErrorItem泛型类型,如下所示:

这是不可能的,因为我只能存储ErrorItem<Object>!我已经在脑海中研究了一些解决方法;大多数情况下,它们包括在运行中创建一个ErrorItem合适类型的新的,但它只是感觉有点难看。另一个想法是使用 aDictionary来按类型组织项目,但它似乎仍然不正确。

有什么模式可以帮助我吗?我知道解决这个问题的最简单方法是添加一个 A、B、C 和 D 派生自的基类,但我试图对原始工具产生尽可能小的影响。任何变通方法的成本是否足够大,以至于我应该推动更改初始工具?

0 投票
14 回答
266525 浏览

java - 如何在 Java 中克隆通用列表?

我有一个ArrayList<String>我想退回的副本。 ArrayList有一个具有以下签名的克隆方法:

调用此方法后,如何将返回的 Object 转换回ArrayList<String>

0 投票
9 回答
7152 浏览

.net - .NET 中的非泛型集合是否已过时?

换一种说法:

是否有充分的理由选择松散类型的集合而不是类型安全的集合(HashTable 与 Dictionary)?它们仍然只是为了兼容性吗?

据我了解,泛型集合不仅是类型安全的,而且它们的性能更好。


这是一篇关于该主题的综合文章:使用 C# 2.0 对数据结构进行广泛检查

0 投票
5 回答
27315 浏览

java - EasyMock:如何在没有警告的情况下创建泛型类的模拟?

编码

给我一个警告“类型安全:SomeClass 类型的表达式需要未经检查的转换才能符合 SomeClass<Integer>”。

0 投票
5 回答
2673 浏览

.net - 如何解决 Generic.IList 之间的调用歧义.this[] 和 IList.this[]?

我有一个集合,它实现了一个扩展 IList<T> 和 List 的接口。

这意味着我有两个版本的索引器。

我希望使用通用实现,所以我通常实现它:

我只需要 IList 版本进行序列化,所以我明确地实现它,以保持它隐藏:

但是,在我的单元测试中,以下

导致编译器错误

以下方法或属性之间的调用不明确

我对此有点惊讶;我相信我以前做过,而且效果很好。我在这里想念什么?如何让 IList<T> 和 IList 在同一个接口中共存?

编辑IList<T>没有实现 IList,我必须实现 IList 进行序列化。我对解决方法不感兴趣,我想知道我缺少什么。

再次编辑:我不得不从界面中删除 IList 并将其移动到我的班级。我不想这样做,因为实现接口的类最终会被序列化为 Xaml,这需要集合来实现 IDictionary 或 IList...

0 投票
3 回答
21303 浏览

c# - Activator.CreateInstance(string) 和 Activator.CreateInstance() 不同之处

不,这不是关于泛型的问题。

我有一个工厂模式,其中包含几个具有内部构造函数的类(如果不通过工厂,我不希望它们被实例化)。

我的问题是CreateInstance失败并出现“没有为此对象定义无参数构造函数”错误,除非我在非公共参数上传递“true”。

例子

我想让工厂通用以使其更简单,如下所示:

但是,我无法找到如何传递该“真实”参数以使其接受非公共构造函数(内部)。

我错过了什么还是不可能的?

0 投票
3 回答
853 浏览

.net - 在数组中保存一个开放的泛型类型?

我正面临 .NET 泛型的问题。我想做的是保存一组泛型类型(GraphicsItem):

如何将这种开放的泛型类型保存在数组中?

0 投票
5 回答
1102 浏览

java - 我可以将以下代码转换为使用泛型吗?

我正在将应用程序转换为使用 Java 1.5 并找到以下方法:

理想情况下,我想让该方法采用两个相同类型的 Comparables,是否可以转换它以及如何转换?

我认为以下方法可以解决问题:

但它未能消除 IntelliJ 中的警告“未检查调用 'compareTo(T)' 作为原始类型 'java.lang.Comparable' 的成员”:

0 投票
5 回答
30091 浏览

c# - 在 C# 中使用泛型创建数学库

是否有任何可行的方法使用泛型来创建不依赖于选择存储数据的基本类型的数学库?

换句话说,假设我想写一个 Fraction 类。分数可以用两个整数或两个双精度数或诸如此类的形式表示。重要的是基本的四种算术运算都定义得很好。所以,我希望能够写Fraction<int> frac = new Fraction<int>(1,2)和/或Fraction<double> frac = new Fraction<double>(0.1, 1.0).

不幸的是,没有代表四个基本操作(+、-、*、/)的接口。有没有人找到一种可行的、可行的方法来实现这一点?

0 投票
14 回答
102112 浏览

c# - C#中泛型参数的空值或默认比较

我有一个这样定义的通用方法:

我要做的第一件事是检查 myArgument 的值是否是该类型的默认值,如下所示:

但这不能编译,因为我不能保证 T 会实现 == 运算符。所以我将代码切换为:

现在可以编译,但如果 myArgument 为空,则将失败,这是我正在测试的一部分。我可以像这样添加一个明确的空检查:

现在这对我来说是多余的。ReSharper 甚至建议我将 myArgument == null 部分更改为 myArgument == default(T) ,这是我开始的地方。有没有更好的方法来解决这个问题?

我需要同时支持引用类型和值类型。