Я работаю по следующей структуре:Несколько уровней подклассов и метод построения цепочки
Buffer
XBuffer
расширяетBuffer
XYBuffer
расширяетXBuffer
Все объекты должны быть инстанциируемый, так нет abstract
, чтобы поддерживать совместимость вперед.
я придумал следующее, ловушками/вопросов, которые я опишу ниже:
public class Buffer<S extends Buffer<S>> {
protected final int bufferType;
protected final int bufferDataType;
protected int bufferId;
protected boolean created;
public Buffer(final int bufferType, final int bufferDataType) {
this.bufferType = bufferType;
this.bufferDataType = bufferDataType;
}
@SuppressWarnings("unchecked")
public S create() {
assertNotCreated();
bufferId = GL15.glGenBuffers();
created = true;
return (S)this;
}
@SuppressWarnings("unchecked")
public S bind() {
assertCreated();
GL15.glBindBuffer(bufferType, bufferId);
return (S)this;
}
@SuppressWarnings("unchecked")
public S fillData(final float[] data) {
assertCreated();
FloatBuffer dataBuffer = BufferUtils.createFloatBuffer(data.length).put(data);
dataBuffer.flip();
GL15.glBufferData(bufferType, dataBuffer, bufferDataType);
return (S)this;
}
public void delete() {
assertCreated();
GL15.glDeleteBuffers(bufferId);
}
public int getBufferId() {
return bufferId;
}
public boolean hasBeenCreated() {
return created;
}
private void assertCreated() {
if (!hasBeenCreated()) {
throw new RuntimeException("Buffer has not been created.");
}
}
private void assertNotCreated() {
if (hasBeenCreated()) {
throw new RuntimeException("Buffer has been created already.");
}
}
@Override
public String toString() {
return "Buffer(" + bufferType + ", " + bufferDataType + ", " + bufferId + ", " + created + ")";
}
}
public class ArrayBuffer<S extends ArrayBuffer<S>> extends Buffer<S> {
public ArrayBuffer(final int bufferDataType) {
super(GL15.GL_ARRAY_BUFFER, bufferDataType);
}
}
public class StaticDrawArrayBuffer extends ArrayBuffer<StaticDrawArrayBuffer> {
public StaticDrawArrayBuffer() {
super(GL15.GL_STATIC_DRAW);
}
}
Сейчас происходит следующее:
StaticDrawArrayBuffer
работает, как и ожидалось.ArrayBuffer
не работает должным образом, так как я не могу создать экземпляр без использования дженериков. (Имейте в виду: дженерики, используемые здесь, только там, чтобы помочь мне, а не на самом деле предоставлять общие функции)Buffer
не работает должным образом с той же проблемой, что иArrayBuffer
.
Что мне нужно?
- Все, что есть сейчас, за исключением того, что я могу создать экземпляр
Buffer
иArrayBuffer
без использования дженериков.
Как бы это сделать?
Для уточнения Более того, эти заявления должны все компиляции:
Buffer buffer = new Buffer().create().bind();
ArrayBuffer arrayBuffer = new ArrayBuffer().create.bind();
StaticDrawArrayBuffer staticDrawArrayBuffer = new StaticDrawArrayBuffer().create.bind()
Если бы я не использовать какие-либо генерики вообще, то new ArayBuffer().create()
будет возвращать Buffer
, в результате чего его нельзя назначить ArrayBuffer
. Он оставляет цепочку методов Buffer
неповрежденными, но, кроме того, она также нарушится, если цепочка будет содержать методы, доступные только для ArrayBuffer
.
Если это помогает, у меня есть возможность использовать Java 8, если это почти без ошибок (должно быть, я думаю?), Учитывая, что этот проект долго не будет видеть реальный дневной свет.
Вы спрашиваете, как вы можете использовать тип вы сделали общий без дженериков? Не делайте это * generic. Учитывая стирание типа Java, что вы подразумеваете под «* общей функциональностью»? –
@ElliottFrisch Я не могу сделать это не общим, тогда функциональность ломается, как описано в моей новой редакции. Лучшее «легкое» решение, которое я могу сделать, это иметь не общий тип «RawArrayBuffer» и «RawBuffer». С * универсальной функциональностью * я имею в виду что-то вроде «List», где параметр типа «String» также фактически используется в результирующем объекте. –
skiwi
Прочтите [это] (http://docs.oracle.com/javase/tutorial/java/generics/erasure.html) и объясните, что вы просите. Кроме того, Java 8 планируется выпустить в марте ... Я бы не стал заниматься производством, пока не было нескольких суб-релизов, но кто-то должен быть морским свинком. –