2011-06-06 57 views
6

对不起,我想不出一个更简洁的标题。仿制药问题和阵列

我的问题是,为什么下面这段代码的工作:

public abstract class TObjectPool<T> { 
protected Object[] availableObjects; 

TObjectPool(int size){ 
    availableObjects = new Object[size]; 
} 

protected class RenderElementPool extends TObjectPool<RenderElement>{ 
    @Override 
    public void fill() { 
     for (int i = 0; i < capacity; i++) { 
      availableObjects[i] = new RenderElement(); 
     } 
    } 
} 

时,它不会工作使对象数组的通用像这样:

public abstract class TObjectPool<T> { 
protected T[] availableObjects; 

TObjectPool(int size){ 
    availableObjects = (T[]) new Object[size]; 
} 

当availableObjects [I] = new RenderElement();行在后面的例子中执行我得到一个ClassCastException。我明白为什么它在第一个例子中有效,但不是为什么它不在第二个例子中。 availableObjects应该是一个RenderElement数组,我试图给它一个RenderElement。我错过了哪些关键信息?

感谢您的帮助。

更新...

非常感谢您的答复。我想我理解,但我已成功地再次混淆自己:

如果我的函数添加:

public void add(int index, T object){ 
    availableObjects[index] = object; 
} 

到TObjectPool类。它会很高兴地使用T []数组。

所以新TObjectPool和子类池如下:

public abstract class TObjectPool<T> { 
T[] availableObjects; 

TObjectPool(int size){ 
    availableObjects = (T[])new Object[size]; 
    capacity = size; 
    count = capacity; 
    fill(); 
} 

public void add(int index, T object){ 
    availableObjects[index] = object; 
} 

protected class RenderElementPool extends TObjectPool<RenderElement>{ 
@Override 
public void fill() { 
    for (int i = 0; i < capacity; i++) { 
     add(i, new RenderElement()); //this works 
     //availableObjects[i] = new RenderElement(); //this gives an exception   
    } 
} 
} 

我知道我能避开这个问题,现在读您的答复后,但我很好奇。任何人都可以从这个特点中了解一些情况吗?

再次感谢。

+0

这是如此好的问题。我在最后5分钟考虑它,不知道答案! – AlexR 2011-06-06 18:35:59

+0

请!给我们[SSCCE](http://sscce.org)样式的代码片段。 – MockerTim 2011-06-06 18:43:38

回答

4

由于Object[]对于所有T都是T[]的超类,但对于除Object之外的任何T都不是子类型,因此投中失败。

如果您在运行时有Class<T>可用,则可以使用Array.newInstance创建T[]

1

你可以尝试使用数组是类型T

的这里是你如何管理:How to create a generic array in Java?

无论使用的强或弱类型。你正在尝试使用弱类型。

+1

对不起,男人,但这样的事情根本不起作用。它没有通过compillation。 – AlexR 2011-06-06 18:28:39

+0

你说得对。你可以使用下面的代码:[link](http://stackoverflow.com/questions/529085/java-how-to-generic-array-creation) – rambo 2011-06-06 18:36:04

+0

我认为这不起作用,因为Java中的数组不是通用的。 – gpeche 2011-06-06 18:37:56

1

Java中的数组不是通用的,因此您不能将Java泛型应用于数组。特别是,如果您在构造函数中执行的操作从Object[]T[]错误,并且很可能是错误的原因。

知道了这一点,你可以在你需要实例化的东西是不是一个通用类中通用的使用您使用同样的伎俩:通过特定的类对象

TObjectPool(int size, Class<T> klass) { 
    availableObjects = Array.newInstance(klass, size); 
} 
... 
protected class RenderElementPool extends TObjectPool<RenderElement>{ 
    // Pass the class object to super constructor 
    public RenderElementPool(int size) { 
     super(size, RenderElement.class); 
    } 
    ... 
    @Override 
    public void fill() { 
     for (int i = 0; i < capacity; i++) { 
      availableObjects[i] = new RenderElement(); 
     } 
    } 
}