Tag: generics

如何在Java中创build一个通用数组?

由于Javagenerics的实现,你不能有这样的代码: public class GenSet<E> { private E a[]; public GenSet() { a = new E[INITIAL_ARRAY_LENGTH]; // error: generic array creation } } 我怎样才能实现这一点,同时保持types安全? 我在Java论坛上看到了这样一个解决scheme: import java.lang.reflect.Array; class Stack<T> { public Stack(Class<T> clazz, int capacity) { array = (T[])Array.newInstance(clazz, capacity); } private final T[] array; } 但我真的不知道发生了什么事。

我如何使用reflection来调用一个通用的方法?

当编译时不知道types参数,而是在运行时dynamic地获得types参数时,调用generics方法的最好方法是什么? 考虑下面的示例代码 – 在Example()方法中,使用存储在myTypevariables中的Type来调用GenericMethod<T>()的最简洁的方法是什么? public class Sample { public void Example(string typeName) { Type myType = FindType(typeName); // What goes here to call GenericMethod<T>()? GenericMethod<myType>(); // This doesn't work // What changes to call StaticMethod<T>()? Sample.StaticMethod<myType>(); // This also doesn't work } public void GenericMethod<T>() { // … } public static void StaticMethod<T>() { //… […]

什么是PECS(生产者扩大消费者超级)?

在阅读generics时,我遇到了PECS( Producer extends和Consumer super )。 有人可以向我解释如何使用PECS解决extends和super之间的混淆?

List <Dog>是List <Animal>的一个子类吗? 为什么不是Java的generics隐式多态?

我对Javagenerics如何处理inheritance/多态性有些困惑。 假设以下层次结构 – 动物 (家长) 狗 – 猫 (儿童) 所以假设我有一个方法doSomething(List<Animal> animals) 。 按照所有inheritance和多态的规则,我会假定一个List<Dog> 是一个List<Animal> ,一个List<Cat> 是一个List<Animal> – 所以任何一个都可以传递给这个方法。 不是这样。 如果我想实现这种行为,我必须明确地告诉方法通过说doSomething(List<? extends Animal> animals)接受动物子集的doSomething(List<? extends Animal> animals) 。 我明白这是Java的行为。 我的问题是为什么 ? 为什么多态一般是隐含的,但是当涉及到generics时,必须指定它?

什么是原始types,为什么我们不应该使用它?

问题: Java中的原始types是什么?为什么我经常听说他们不应该用在新代码中? 如果我们不能使用原始types,那么有什么替代方法?

检查一个类是否从generics类派生

我有我的派生类项目中的generics类。 public class GenericClass<T> : GenericInterface<T> { } public class Test : GenericClass<SomeType> { } 有没有什么办法来找出一个Type对象是从GenericClass派生? t.IsSubclassOf(typeof(GenericClass<>)) 不起作用。