ArrayList是如何在Java Collection Framework内部表示的.

Mus*_*ala 8 java generics collections casting arraylist

我正在通过Robert Sedgewick参加Coursera的算法讲座.当罗伯特先生指出一个人不能使用Generics with Arrays时,我有点困惑,因为它是不允许的.但Collection Framework中的ArrayList在内部使用Arrays,允许使用Generic数据类型.我的意思是说我们可以执行以下操作:

ArrayList<Integer> list = new ArrayList<Integer>();
Run Code Online (Sandbox Code Playgroud)

他指出的一个黑客是这样的:

public class FixedCapacityStack<Item>{
    private Item[] s;
    private int N = 0;

public FixedCapacityStack(int capacity)
{  s = (Item[]) new Object[capacity];} //this hack
Run Code Online (Sandbox Code Playgroud)

他还提到这是一个丑陋的黑客,必须避免,它也会在编译过程中产生警告.

我的问题是:

1.)ArrayList如何在内部表示各种泛型类型?

2.)如果(假设)他们使用上面提到的hack,为什么在用ArrayList编译程序时它不会产生警告?

3.)除了上面的演员之外还有更好的方法吗?

Sbo*_*odd 2

根据来源:

1 -ArrayList将项目存储在 an 中Object[],并在检索单个元素时转换值。实际上有一个@SuppressWarnings("unchecked")演员发生的地方。

2 - 这里有两个答案 - 第一个是您(通常)不编译ArrayList,而只是将其包含在rt.jarJRE/JDK 中的类路径中。第二个是ArrayList使用从到泛型类型的@SuppressWarnings未经检查的转换。Object

3 - 您的另一个选择(“更好”是相当主观的)是要求Class您的通用类型,并用于Array.newInstance(Class clazz, int capacity)创建您的数组,如本问题中所述

  • `Item`是一个泛型类型参数,它被删除了,请尝试创建问题中类的实例,它不会抛出`ClassCastException`。 (3认同)
  • 这里:https://ideone.com/rBFjRS,还有https://docs.oracle.com/javase/tutorial/java/generics/types.html (3认同)