Tag: generics

使用IsAssignableFrom和'open'genericstypes

使用reflection,我试图find从给定的基类inheritance的types的集合。 找出简单的types并不需要太长的时间,但是当涉及到非专利types的时候,我却难以理解了。 对于这段代码,第一个IsAssignableFrom返回true,但是第二个返回false。 然而,最后的任务编译得很好。 class class1 { } class class2 : class1 { } class generic1<T> { } class generic2<T> : generic1<T> { } class Program { static void Main(string[] args) { Type c1 = typeof(class1); Type c2 = typeof(class2); Console.WriteLine("c1.IsAssignableFrom(c2): {0}", c1.IsAssignableFrom(c2)); Type g1 = typeof(generic1<>); Type g2 = typeof(generic2<>); Console.WriteLine("g1.IsAssignableFrom(g2): {0}", g1.IsAssignableFrom(g2)); generic1<class1> […]

如何在Java中的接口声明上应用更多的约束?

假设我有以下界面: interface Mammal { void marry(Mammal m); Mammal giveBirthTo(); } 但是,这并不完全是我想要的。 显然,一个人不能娶一只狗,也不能生一只猫。 那么如何将这些信息embedded到接口中,使得inputtypes和输出types可以在实现时自动更改?

如何确定T是generics中的值types还是引用类?

我有一个generics方法的行为取决于T是引用types或值types。 它看起来如此: T SomeGenericMethod <T> (T obj) { if (T is class) //What condition I must write in the brackets? //to do one stuff else //if T is a value type like struct, int, enum and etc. //to do another stuff } 我不能像这样复制这个方法: T SomeGenericMethod <T> (T obj) where T : class { //Do one […]

如何更新C#中List <>中的对象

我有一个List<>的自定义对象。 我需要通过一些独特的属性在这个列表中find一个对象,并更新这个对象的另一个属性。 什么是最快的方法呢?

C#generics和types检查

我有一个使用IList<T>作为参数的方法。 我需要检查T对象的types,并根据它做一些事情。 我试图使用T值,但编译器不允许它。 我的解决scheme如下: private static string BuildClause<T>(IList<T> clause) { if (clause.Count > 0) { if (clause[0] is int || clause[0] is decimal) { //do something } else if (clause[0] is String) { //do something else } else if (…) //etc for all the types else { throw new ApplicationException("Invalid type"); } } } 必须有更好的方法来做到这一点。 […]

Javagenerics:多个generics参数?

我想知道是否可以编写一个接受多个genericstypes的函数,如下所示: public int void myfunction(Set<T> a, Set<T> b) { return 5; } Set<Integer> setA = new HashSet<Integer>(); Set<String> setB = new HashSet<String>(); int result = myfunction(setA, setB); 这会工作吗? 每个参数中的generics是否意味着每个参数都必须具有通用的相同typesT? 谢谢!

如何在Spring中自动assemblygenerics<T>的bean?

我有一个需要在@Configuration类中自动assembly的bean Item<T> 。 @Configuration public class AppConfig { @Bean public Item<String> stringItem() { return new StringItem(); } @Bean public Item<Integer> integerItem() { return new IntegerItem(); } } 但是当我尝试@Autowire Item<String> ,我得到以下exception。 "No qualifying bean of type [Item] is defined: expected single matching bean but found 2: stringItem, integerItem" 我应该怎么AutowiregenericstypesItem<T>在spring?

如何使用具有“贪婪”构造函数的Scan来使用具有通用未closurestypes的StructureMap

在各种堆栈溢出问题和博客post之间,关于开放式generics和StructureMap的主题有相当多的文档。 不幸的是,我必须错过一些东西,因为我试图使用scan来执行configuration,而具有“贪婪”构造函数的类实现还没有工作。 我希望StructureMap通过引用其实现的接口来获取下一个类的实例。 ToCsvService存在于名为“基础结构”的未引用程序ToCsvService 。 IToCsvService存在于名为Core的引用程序IToCsvService 。 正如你可以看到ToCsvService有一个“贪婪的”构造函数。 public class ToCsvService<TSource> : IToCsvService<TSource> { public ToCsvService(ICollection<TSource> collection) { } } 我让StructureMap通过ConnectImplementationsToTypesClosing方法了解ToCsvService 。 ObjectFactory.Initialize(cfg => { cfg.Scan(scan => { scan.Assembly("Infrastructure"); scan.WithDefaultConventions(); // even with this call StructureMap cannot use ToCsvService // instance of IToCsvService (though wouldn't expect it to) scan.ConnectImplementationsToTypesClosing (typeof(IToCsvService<>)); }); }); 从ObjectFactory.WhatDoIHave()方法看来,StructureMap知道ToCsvService 。 PluginType名称说明 […]

在TList <T>中的Delphi XE8错误,需要解决方法

升级到XE8后,我们的一些项目开始打破数据。 看起来像TList实现中的一个错误。 program XE8Bug1; {$APPTYPE CONSOLE} uses System.SysUtils, Generics.Collections; type TRecord = record A: Integer; B: Int64; end; var FRecord: TRecord; FList: TList<TRecord>; begin FList := TList<TRecord>.Create; FRecord.A := 1; FList.Insert(0, FRecord); FRecord.A := 3; FList.Insert(1, FRecord); FRecord.A := 2; FList.Insert(1, FRecord); Writeln(IntToStr(FList[0].A) + IntToStr(FList[1].A) + IntToStr(FList[2].A)); end. 此代码在XE7中打印“123”,之前(应该是这样),但在XE8中打印“120”。 也许有人知道这个quickfix? 更新:非官方修复在这里

为什么generics方法和genericstypes有不同的types引入语法?

在研究generics时,我注意到generics方法和generics (类或接口)之间的types引入语法的差异使我困惑。 通用方法的语法是 <T> void doStuff(T t) { // Do stuff with T } 文档说 generics方法的语法包括一个types参数,尖括号内,并出现在方法的返回types之前 genericstypes的语法是 class Stuff<T> { // Do stuff with T T t; } 文档说 由尖括号(<>)分隔的types参数部分在类名后面 。 它指定了types参数 既没有说明它为什么必须在之前或之后。 为了保持一致,我期望的方法语法是 void doStuff<T>(T t) {}或types语法(对于类)是class <T>Stuff {} ,但显然不是这种情况。 为什么要先介绍一个,之后呢? 我主要以List<String>的forms使用generics,并认为<String>List可能看起来很奇怪,但这是一个主观的论点,除了方法也是这样。 你可以像this.<String>doStuff("a string");调用doStuff this.<String>doStuff("a string"); 寻找一个技术性的解释我认为在指定返回types之前,可能<T>必须被引入到一个方法中,因为T可能是返回types,编译器也许不能像这样向前看,但这听起来很奇怪,因为编译器是聪明。 我认为除了“语言devise者就是这么做的”之外,还有一个解释,但我找不到它。