Да ладно ... Я проверил это, чтобы убедиться, и я верю, что он делает то, что вы ищете.
Вам нужен интерфейс:
public interface MyInterface
{
public int getSize();
public int getLumpIndex();
}
Ваши классы реализуют этот интерфейс:
public class Plane implements MyInterface
{
...
public int getSize()
{
return SIZE;
}
public int getLumpIndex()
{
return LUMP_INDEX;
}
}
В классе, экземпляром которого является header
, у вас есть ...
public <E extends MyInterface> E[]
getArray(Class<E> c, MyInterface foo)
{
int count = lumps[foo.getLumpIndex()].filelen / foo.getSize();
E[] myArray = (E[]) Array.newInstance(c, count);
for(int i = 0; i < count; i++)
myArray[i] = c.newInstance();
return myArray;
}
Вы можете назвать это, скажем, классом вашего самолета как:
Plane[] p = header.getArray(Plane.class, this);
Я думаю ? :) Может кто-то посмотреть на это и посмотреть, если я выключен?
( РЕДАКТИРОВАТЬ: Becasue я проверил это сейчас - это работает)
На дополнительном примечании вы можете исключить методы получения в каждом классе, заставив getArray()
принять размер и индекс в качестве аргументов:
public <E extends MyInterface> E[]
getArray(Class<E> c, int size, int index)
{
int count = lumps[index].filelen / size;
E[] myArray = (E[]) Array.newInstance(c, count);
for(int i = 0; i < count; i++)
myArray[i] = c.newInstance();
return myArray;
}
И назовите его так:
Plane p[] = header.getArray(Plane.class, SIZE, LUMP_INDEX);
из ваших классов. Интерфейс просто становится пустым для предоставления универсального типа, и вам не нужно определять методы получения.
ИЛИ (последнее редактирование обещаю, но это дает вам выбор и объясняет немного о дженериках)
Угробить интерфейс. Это удаляет некоторую проверку работоспособности, потому что методу не важно, какой тип объекта вы ему дадите:
public <E> E[]
getArray(Class<E> c, int size, int index)
{
...
Теперь вам не нужно определять интерфейс или реализовывать его, вы просто звоните:
Plane p[] = header.getArray(Plane.class, SIZE, LUMP_INDEX);