Tag: generics

普通旧式C中的types安全通用数据结构

我做了比“普通的老C”编程更多的C ++编程。 在纯C编程时,我非常想念的一件事是通过模板在C ++中提供的types安全的通用数据结构。 为了具体,请考虑一个通用的单向链表。 在C ++中,定义自己的模板类是一件简单的事情,然后将其实例化为您需要的types。 在C中,我可以想到实现一个通用单链表的几种方法: 一次写入链表types和支持过程,使用void指针绕过types系统。 编写预处理macros以获取必要的types名称等,以生成数据结构和支持过程的特定于types的版本。 使用更复杂的独立工具来生成所需types的代码。 我不喜欢选项1,因为它颠覆了types系统,而且可能比特定types的实现具有更差的性能。 使用所有types的数据结构的统一表示,以及从void指针转换到/从void指针,据我所知,需要一个间接的,这是一个专门的元素types实现将避免。 选项2不需要任何额外的工具,但是感觉有些笨重,并且在使用不当时可能会给编译器带来不好的错误。 选项3可以提供比选项2更好的编译器错误消息,因为专用数据结构代码将以扩展forms存在,可以在编辑器中打开并由程序员检查(而不是由预处理器macros生成的代码)。 不过,这个选项是最重的,是一种“穷人的模板”。 我以前使用过这种方法,使用简单的sed脚本来专门化一些C代码的“模板化”版本。 我想用C而不是C ++来编写我的未来“低级”项目,但是由于想重写每种特定types的通用数据结构而感到害怕。 人们对这个问题有什么经验? 在C中有没有很好的通用数据结构和algorithm库,它们不会与选项1一起使用(即,从void指针进行转换,这会牺牲types安全性并增加间接级别)?

如何实例化List <MyType>?

我怎么能得到这样的东西工作? 我可以检查(obj instanceof List<?>)但不是(obj instanceof List<MyType>) 。 有没有办法可以做到这一点?

在C#中初始化一个Generic.List

在C#中,我可以使用以下语法初始化一个列表。 List<int> intList= new List<int>() { 1, 2, 3 }; 我想知道这个{}语法是如何工作的,如果它有一个名字。 有一个构造函数需要IEnumerable ,你可以调用它。 List<int> intList= new List<int>(new int[]{ 1, 2, 3 }); 这似乎更“标准”。 当我解构List的默认构造函数时,我只能看到 this._items = Array.Empty; 我希望能够做到这一点。 CustomClass abc = new CustomClass() {1, 2, 3}; 并能够使用1, 2, 3列表。 这个怎么用? 更新 Jon Skeet回答 它调用无参数的构造函数,然后调用Add: > List<int> tmp = new List<int>(); > tmp.Add(1); tmp.Add(2); tmp.Add(3); > […]

如何将string转换为任何types

我想将一个string转换为一个genericstypes 我有这个: string inputValue = myTxtBox.Text; PropertyInfo propInfo = typeof(MyClass).GetProperty(myPropertyName); Type propType = propInfo.PropertyType; object propValue = ????? 我想将'inputString'转换为该属性的types,以检查它是否兼容我该怎么做? TKS

一个对象怎么能不被比较为null?

对于KeyValuePair方法,我有一个“可选”参数。 我想要一个重载,将null传递给此参数的核心方法,但在核心方法中,当我想检查KeyValuePair是否为null时,出现以下错误: Operator '!=' cannot be applied to operands of type System.Collections.Generic.KeyValuePair<string,object>' and '<null>. 我怎么能不被允许检查一个对象是否为空?

为什么java.util.Properties实现Map <Object,Object>而不是Map <String,String>

java.util.Properties类是为了表示键和值都是string的映射。 这是因为Properties对象用于读取文本文件.properties文件。 那么,为什么在Java 5中他们改造了这个类来实现Map<Object,Object>而不是Map<String,String>呢? javadoc说: 由于Properties从Hashtableinheritance,put和putAll方法可以应用于Properties对象。 强烈build议不要使用它们,因为它们允许调用者插入其键或值不是string的条目。 应该使用setProperty方法。 如果store或save方法在包含非String键或值的“受损”Properties对象上调用,则调用将失败。 由于键和值都被认为是string,那么为什么不使用适当的generics来强制执行? 我猜使Properties实现Map<String,String>不能完全向后兼容为Java 5以前版本编写的代码。如果你有老的代码将非string粘贴到一个Properties对象中,那么这个代码将不再使用Java 5进行编译但是…不是件好事吗? generics的全部不是在编译时捕获这种types的错误吗?

列出<T>与一个私人设置只读

我该如何公开一个List<T>以便它是只读的,但可以私下设置? 这不起作用: public List<string> myList {readonly get; private set; } 即使你这样做: public List<string> myList {get; private set; } 你仍然可以这样做: myList.Add("TEST"); //This should not be allowed 我想你可以有: public List<string> myList {get{ return otherList;}} private List<string> otherList {get;set;}

在Java中通过types参数的类作为generics方法的types参数

问题总结:我想通过一个types参数的类(例如ArrayList<SomeClass> )作为typesparameter passing给generics方法。 假设我有一个方法: public static <T> T getGenericObjectFromJson(String json, Class<T> genericType){ // details unimportant, basically returns an object of specified type return JsonParser.fromJson(json, genericType); } 当然,这种方法对于任何一种类都是完美的。 我可以这样调用方法,例如: getGenericObjectFromJson(jsonString, User.class) 问题:我发现我不能这样做: getGenericObjectFromJson(jsonString, ArrayList<User>.class) 在句法上,这显然是无效的。 但是,我不确定我会如何完成这样的事情。 当然,我可以通过ArrayList.class ,但是通用types的添加使得它不再是语法上有效的,我想不出一个办法。 唯一的直接解决scheme就是这样(这看起来相当愚蠢): getGenericObjectFromJson(jsonString, new ArrayList<User>().getClass()) 然而,我们最终失去了genericstypes,只是取回一个未知types的ArrayList(尽pipe它可以被强制转换)。 另外,不必要的实例化一个对象。 到目前为止,我唯一的解决scheme是将该方法包装在一个包含可以实例化的genericstypes参数的类中,如下所示: public class JsonDeserializer<T>… 在这种情况下, getGenericObjectFromJson方法将使用该类的genericstypes。 问题:最后,我很好奇为什么我不能通过一个types参数的类,以及是否有一种方法来实现我想要做的。 一如往常,让我知道这个问题是否有问题。

如何定义基本types的genericstypes限制?

我有以下通用types的方法: T GetValue<T>(); 我想限制T原始types,如int,string,浮动,但不是类的types。 我知道我可以像这样为类types定义generics: C GetObject<C>() where C: class; 我不确定原始types是否可行,如果是的话。

Params IEnumerable <T> c#

为什么不能用params使用IEnumerable? 这会永久解决吗? 我真的希望他们会重写旧的图书馆使用generics…