固定数量的可以迭代的通用对象

时间:2014-02-06 12:52:19

标签: java arrays generics

我有一个总是拥有四个对象的类:

class Foo<E> {
    Cow<E> a, b, c, d;
}

我希望能够迭代它们,所以理想情况下我想使用数组:

class Foo<E> {
    Cow<E>[] cows = new Cow<E>[4]; // won't work, can't create generic array
}

我不想使用列表或集合,因为我希望总是有4个Cow对象。对我来说最好的解决方案是什么?

5 个答案:

答案 0 :(得分:1)

如果你想保留通用性,你将不得不重新实现类似于列表的东西,我认为这不值得。

你说:

  

首先,您可以在列表中添加和删除元素。

你可以创建一个不可修改的列表:

List<E> list = Collections.unmodifiableList(Arrays.asList(a, b, c, d));
  

第二个是我正在创建一个四叉树数据结构,使用列表对性能来说不是太好。四叉树有很多象限,使用列表会显着降低性能。

首先,您可以将列表初始化为正确的大小:

List<E> list = new ArrayList<>(4);

完成后,列表将只使用比数组更多的内存(可能是8个字节:后备阵列引用为4个字节,大小为4个字节)。

就绩效而言an ArrayList performs almost as good as an array

底线:我首先使用列表并衡量效果。如果它不够好而且它是由于使用列表而不是数组,那么你将不得不调整你的设计 - 但我怀疑这将是你的主要问题。

答案 1 :(得分:0)

使用泛型ArrayList,只需要有方法将值插入对象,并在这些方法中进行检查,以确保最终不会有超过4个Cow个对象。< / p>

答案 2 :(得分:0)

使用Collection代替array

List<Cow<E>> cows = new ArrayList<>(); // in Java 7

或者

List<Cow<E>> cows = new ArrayList<Cow<E>>(); //Java 6 and below

更多信息将显示为什么不可能使数组为generics。您可以看到here

答案 3 :(得分:0)

我建议创建一个有界列表。 Java没有内置版本,但您可以使用Google集合创建自定义集合或使用Apache集合中的自定义集合。见Is there a bounded non-blocking Collection in Java?

答案 4 :(得分:0)

Cow<E>[] cows = (Cow<E>[])new Cow[4];

Cow<E>[] cows = (Cow<E>[])new Cow<?>[4];