我有下面的代碼,我只是重構到今天這個,因爲我明白<T extends Buffer>
的真正含義,這裏是簡化版本:避免與雙擴展類泛型未經檢查的強制轉換?
public class Buffer {
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;
}
public <T extends Buffer> T create() {
assertNotCreated();
bufferId = GL15.glGenBuffers();
created = true;
return (T)this;
}
public boolean hasBeenCreated() {
return created;
}
private void assertNotCreated() {
if (hasBeenCreated()) {
throw new RuntimeException("Buffer has been created already.");
}
}
}
public class ArrayBuffer extends Buffer {
public ArrayBuffer(final int bufferDataType) {
super(GL15.GL_ARRAY_BUFFER, bufferDataType);
}
}
public class DynamicDrawArrayBuffer extends ArrayBuffer {
public DynamicDrawArrayBuffer() {
super(GL15.GL_DYNAMIC_DRAW);
}
}
警告發生在Buffer.create()
,壓制警告是否安全?有什麼辦法可以讓它更安全嗎?
另一項要求是,沒有雜波應該/使用這個API的代碼被添加到調用,具體這意味着DynamicDrawArrayBuffer
可能不會得到重視它的仿製藥。
我認爲這是對泛型的濫用。你的創建方法應該是'abstract'並且返回一個'Buffer'。由於返回類型協方差,覆蓋方法可以返回它們自己的類型。 –
@BoristheSpider我曾經這樣做過,但它確實看起來很醜,而且在我看來很煩人。 – skiwi
儘管如此,這不是正確的方法,也不是泛型。 –