Tag: generics

如何初始化一个List <T>到一个给定的大小(而不是容量)?

.NET提供了一个通用的列表容器,其性能几乎相同(请参阅数组与列表的性能问题)。 然而,它们在初始化方面有很大不同 数组很容易初始化为默认值,根据定义,它们已经具有一定的大小: string[] Ar = new string[10]; 它允许一个安全地分配随机项目,说: Ar[5]="hello"; 与列表的东西更棘手。 我可以看到两种执行相同初始化的方法,这两种方法都不是优雅的: List<string> L = new List<string>(10); for (int i=0;i<10;i++) L.Add(null); 要么 string[] Ar = new string[10]; List<string> L = new List<string>(Ar); 什么将是一个更干净的方式? 编辑:到目前为止的答案是指能力,这是预填充列表以外的东西。 例如,刚刚创build的容量为10的列表中,不能做L[2]="somevalue" 编辑2:人们想知道为什么我想用这种方式列出,因为它不是它们打算使用的方式。 我可以看到两个原因: 人们可以相当有说服力地争辩说,名单是“下一代”arrays,增加了灵活性,几乎没有惩罚。 因此,应该默认使用它们。 我指出他们可能不容易初始化。 目前我写的是一个基类,它提供了作为更大框架的一部分的默认function。 在我提供的默认function中,List的大小在高级中是已知的,因此我可以使用一个数组。 不过,我想提供任何基类dynamic扩展它的机会,因此我select一个列表。

.NET是否有内置的EventArgs <T>?

我正在准备为带有一个参数的事件参数创build一个通用的EventArgs类: public class EventArg<T> : EventArgs { // Property variable private readonly T p_EventData; // Constructor public EventArg(T data) { p_EventData = data; } // Property for EventArgs argument public T Data { get { return p_EventData; } } } 在我这样做之前,C#是否具有内置在该语言中的相同function? 我似乎记得在C#2.0出来的时候碰到类似的东西,但是现在我找不到它了。 或者换一种说法,我是否必须创build自己的通用EventArgs类,或者C#提供了吗? 谢谢你的帮助。

generics方法如何,何时何地具体化?

这个问题让我想知道一个通​​用方法的具体实现在哪里实际存在。 我已经尝试过谷歌,但没有提出正确的search。 如果我们拿这个简单的例子: class Program { public static T GetDefault<T>() { return default(T); } static void Main(string[] args) { int i = GetDefault<int>(); double d = GetDefault<double>(); string s = GetDefault<string>(); } } 在我的脑海中,我一直认为在某些时候它会导致一个实现,有3个必要的具体实现,这样,在天真的伪压缩,我们将有这个逻辑的具体实现,其中使用的具体types导致正确的堆栈分配等。 class Program { static void Main(string[] args) { int i = GetDefaultSystemInt32(); double d = GetDefaultSystemFloat64(); string s = GetDefaultSystemString(); } […]

Java 8中exceptiontypes推断的一个特殊function

当在这个网站上编写另一个答案的代码时,我遇到了这个特点: static void testSneaky() { final Exception e = new Exception(); sneakyThrow(e); //no problems here nonSneakyThrow(e); //ERRROR: Unhandled exception: java.lang.Exception } @SuppressWarnings("unchecked") static <T extends Throwable> void sneakyThrow(Throwable t) throws T { throw (T) t; } static <T extends Throwable> void nonSneakyThrow(T t) throws T { throw t; } 首先,我很困惑为什么sneakyThrow调用对编译器是可以的。 当没有提及任何未经检查的exceptiontypes时,它推断T是什么types的? 其次,接受这个工作,为什么编译器会抱怨nonSneakyThrow调用呢? 他们看起来非常相似。

在eclipse编译器或javac中的错误(“T的types参数无法确定”)

下面的代码 public class GenericsTest2 { public static void main(String[] args) throws Exception { Integer i = readObject(args[0]); System.out.println(i); } public static <T> T readObject(String file) throws Exception { return readObject(new ObjectInputStream(new FileInputStream(file))); // closing the stream in finally removed to get a small example } @SuppressWarnings("unchecked") public static <T> T readObject(ObjectInputStream stream) throws Exception { […]

C#语法 – 通过逗号将string拆分为数组,转换为通用列表和逆序

这是什么正确的语法: IList<string> names = "Tom,Scott,Bob".Split(',').ToList<string>().Reverse(); 我在搞什么? TSource是什么意思?

帮助C#generics错误 – “types'T'必须是一个不可为空的值types”

我是C#的新手,不明白为什么下面的代码不起作用。 public static Nullable<T> CoalesceMax<T>(Nullable<T> a, Nullable<T> b) where T : IComparable { if (a.HasValue && b.HasValue) return a.Value.CompareTo(b.Value) < 0 ? b : a; else if (a.HasValue) return a; else return b; } // Sample usage: public DateTime? CalculateDate(DataRow row) { DateTime? result = null; if (!(row["EXPIRATION_DATE"] is DBNull)) result = DateTime.Parse((string)row["EXPIRATION_DATE"]); if (!(row["SHIPPING_DATE"] […]

为什么这个Java 8程序不能编译?

这个程序在Java 7(或者在带有-source 7 Java 8中)编译得很好,但是没有用Java 8编译: interface Iface<T> {} class Impl implements Iface<Impl> {} class Acceptor<T extends Iface<T>> { public Acceptor(T obj) {} } public class Main { public static void main(String[] args) { Acceptor<?> acceptor = new Acceptor<>(new Impl()); } } 结果: Main.java:10: error: incompatible types: cannot infer type arguments for Acceptor<> Acceptor<?> acceptor […]

testinggenericstypes是string的最佳方法是什么? (C#)

我有一个generics类应该允许任何types,原语或其他。 唯一的问题是使用default(T) 。 在值types或string上调用默认值时,会将其初始化为合理值(如空string)。 在对象上调用default(T)时,它将返回null。 由于各种原因,我们需要确保如果它不是原始types,那么我们将有一个types的默认实例, 而不是 null。 这里是尝试1: T createDefault() { if(typeof(T).IsValueType) { return default(T); } else { return Activator.CreateInstance<T>(); } } 问题 – string不是一个值types,但它没有无参数的构造函数。 所以,目前的解决scheme是: T createDefault() { if(typeof(T).IsValueType || typeof(T).FullName == "System.String") { return default(T); } else { return Activator.CreateInstance<T>(); } } 但是这感觉就像一个kludge。 有一个更好的方式来处理string的情况下?

调用静态generics方法

我遇到了一个涉及静态generics方法的好奇的情况。 这是代码: class Foo<E> { public static <E> Foo<E> createFoo() { // … } } class Bar<E> { private Foo<E> member; public Bar() { member = Foo.createFoo(); } } 我怎么没有在expression式Foo.createFoo()指定任何types的参数? 这是一种types推断? 如果我想明确它,我怎样才能指定types参数?