我有一个总是拥有四个对象的类:
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对象。对我来说最好的解决方案是什么?
答案 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];