Questions tagged «generics»

泛型是在多种语言中发现的参数多态形式,包括.NET语言,Java,Swift和Rust。

20
如何通过对象中的属性对List <T>进行排序
我有一个名为类Order具有的属性,例如OrderId,OrderDate,Quantity,和Total。我有这个Order班的清单: List&lt;Order&gt; objListOrder = new List&lt;Order&gt;(); GetOrderList(objListOrder); // fill list of orders 现在,我想根据Order对象的一个属性对列表进行排序,例如,我需要按订单日期或订单ID对其进行排序。 我该如何在C#中做到这一点?
1247 c#  generics  list  sorting 

21
创建将T约束为枚举的泛型方法
我建立一个功能扩展Enum.Parse的概念, 如果找不到Enum值,则允许解析默认值 不区分大小写 所以我写了以下内容: public static T GetEnumFromString&lt;T&gt;(string value, T defaultValue) where T : Enum { if (string.IsNullOrEmpty(value)) return defaultValue; foreach (T item in Enum.GetValues(typeof(T))) { if (item.ToString().ToLower().Equals(value.Trim().ToLower())) return item; } return defaultValue; } 我收到错误约束不能是特殊类System.Enum。 足够公平,但是有没有允许通用枚举的变通办法,或者我将不得不模仿该Parse函数并将类型作为属性传递,这对代码强制了严格的装箱要求。 编辑谢谢所有下面的建议。 已经解决(我离开了循环以保持不区分大小写-解析XML时正在使用它) public static class EnumUtils { public static T ParseEnum&lt;T&gt;(string value, T defaultValue) …

30
如何在Java中创建通用数组?
由于Java泛型的实现,因此不能有以下代码: public class GenSet&lt;E&gt; { private E a[]; public GenSet() { a = new E[INITIAL_ARRAY_LENGTH]; // error: generic array creation } } 如何在保持类型安全的同时实现此目的? 我在Java论坛上看到了这样的解决方案: import java.lang.reflect.Array; class Stack&lt;T&gt; { public Stack(Class&lt;T&gt; clazz, int capacity) { array = (T[])Array.newInstance(clazz, capacity); } private final T[] array; } 但是我真的不知道发生了什么。

8
如何使用反射调用泛型方法?
当类型参数在编译时未知,而是在运行时动态获取时,调用通用方法的最佳方法是什么? 考虑下面的示例代码-内部Example()方法,什么是最简洁的方式来调用GenericMethod&lt;T&gt;()使用Type存储在myType变量? public class Sample { public void Example(string typeName) { Type myType = FindType(typeName); // What goes here to call GenericMethod&lt;T&gt;()? GenericMethod&lt;myType&gt;(); // This doesn't work // What changes to call StaticMethod&lt;T&gt;()? Sample.StaticMethod&lt;myType&gt;(); // This also doesn't work } public void GenericMethod&lt;T&gt;() { // ... } public static void …
1069 c#  .net  generics  reflection 

17
List <Dog>是List <Animal>的子类吗?为什么Java泛型不是隐式多态的?
我对Java泛型如何处理继承/多态感到困惑。 假设以下层次结构- 动物(父母) 狗 - 猫(儿童) 因此,假设我有一个方法doSomething(List&lt;Animal&gt; animals)。通过将所有继承和多态的规则,我会假设List&lt;Dog&gt; 是一个List&lt;Animal&gt;和List&lt;Cat&gt; 是一个List&lt;Animal&gt;-所以任何一个可以传递给此方法。不是这样 如果要实现此行为,则必须通过说出明确告诉该方法接受Animal的任何子类的列表doSomething(List&lt;? extends Animal&gt; animals)。 我了解这是Java的行为。我的问题是为什么?为什么多态性通常是隐式的,但是当涉及泛型时,必须指定它?



16
如何从泛型类或方法的成员中获取T的类型?
假设我在类或方法中有一个通用成员,因此: public class Foo&lt;T&gt; { public List&lt;T&gt; Bar { get; set; } public void Baz() { // get type of T } } 当我实例化该类时,T它将变为MyTypeObject1,因此该类具有通用的list属性:List&lt;MyTypeObject1&gt;。非泛型类中的泛型方法也是如此: public class Foo { public void Bar&lt;T&gt;() { var baz = new List&lt;T&gt;(); // get type of T } } 我想知道,我的班级列表包含什么类型的对象。那么被称为list的属性Bar或局部变量baz包含什么类型的T? 我不能这样做Bar[0].GetType(),因为列表可能包含零个元素。我该怎么做?
674 c#  .net  generics 


23
如何解决未经检查的演员表警告?
Eclipse给我以下形式的警告: 类型安全性:未经检查的从Object到HashMap的转换 这是从对我无法控制返回对象的API的调用中得出的: HashMap&lt;String, String&gt; getItems(javax.servlet.http.HttpSession session) { HashMap&lt;String, String&gt; theHash = (HashMap&lt;String, String&gt;)session.getAttribute("attributeKey"); return theHash; } 如果可能的话,我想避免Eclipse警告,因为从理论上讲,它们至少表明潜在的代码问题。不过,我还没有找到消除这种情况的好方法。我可以将涉及到的单行本身提取到一个方法中,然后添加@SuppressWarnings("unchecked")到该方法中,从而在我忽略警告的地方限制了代码块的影响。还有更好的选择吗?我不想在Eclipse中关闭这些警告。 在我接触代码之前,它比较简单,但是仍然会引发警告: HashMap getItems(javax.servlet.http.HttpSession session) { HashMap theHash = (HashMap)session.getAttribute("attributeKey"); return theHash; } 当您尝试使用哈希时,问题出在其他地方,您将得到警告: HashMap items = getItems(session); items.put("this", "that"); Type safety: The method put(Object, Object) belongs to the raw type HashMap. References …
610 java  generics  warnings 


19
如何使方法返回类型通用?
考虑以下示例(OOP书籍中的典型示例): 我有一Animal堂课,每个人Animal可以有很多朋友。 和子类喜欢Dog,Duck,Mouse等里面加如特定行为bark(),quack()等等。 这是Animal课程: public class Animal { private Map&lt;String,Animal&gt; friends = new HashMap&lt;&gt;(); public void addFriend(String name, Animal animal){ friends.put(name,animal); } public Animal callFriend(String name){ return friends.get(name); } } 这是一些带有大量类型转换的代码片段: Mouse jerry = new Mouse(); jerry.addFriend("spike", new Dog()); jerry.addFriend("quacker", new Duck()); ((Dog) jerry.callFriend("spike")).bark(); ((Duck) jerry.callFriend("quacker")).quack(); 有什么办法可以将泛型用于返回类型来摆脱类型转换,所以我可以说 jerry.callFriend("spike").bark(); jerry.callFriend("quacker").quack(); 这是一些带有返回类型的初始代码,这些代码作为从未使用过的参数传递给该方法。 …

27
在Java中创建泛型类型的实例?
是否可以在Java中创建泛型类型的实例?我正在根据我所看到的答案进行思考no(由于类型删除),但是如果有人能看到我所缺少的内容,我将很感兴趣: class SomeContainer&lt;E&gt; { E createContents() { return what??? } } 编辑:事实证明 超级类型令牌可以用来解决我的问题,但是它需要很多基于反射的代码,如下面的一些答案所示。 我将对此开放一会儿,看看是否有人提出与Ian Robertson的Artima Article截然不同的东西。
576 java  generics 

13
如何从C#中的通用方法返回NULL?
我有一个使用此(虚拟)代码的通用方法(是的,我知道IList具有谓词,但是我的代码未使用IList但使用了其他集合,无论如何这与问题无关...) static T FindThing&lt;T&gt;(IList collection, int id) where T : IThing, new() { foreach T thing in collecion { if (thing.Id == id) return thing; } return null; // ERROR: Cannot convert null to type parameter 'T' because it could be a value type. Consider using 'default(T)' instead. } 这给了我一个构建错误 …
546 c#  generics 

7
为什么C#禁止使用通用属性类型?
这会导致编译时异常: public sealed class ValidatesAttribute&lt;T&gt; : Attribute { } [Validates&lt;string&gt;] public static class StringValidation { } 我意识到C#不支持通用属性。但是,经过大量谷歌搜索之后,我似乎找不到原因。 有谁知道为什么泛型类型不能衍生自Attribute?有什么理论吗?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.