gpt4 book ai didi

java - 避免使用具有双扩展类的泛型进行未经检查的强制转换?

转载 作者:行者123 更新时间:2023-12-01 08:04:59 24 4
gpt4 key购买 nike

我有以下代码,我今天刚刚将其重构,因为我了解了 <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可能无法附加泛型。

最佳答案

这显然不是类型安全的。你可以这样写

ArrayBuffer a = new ArrayBuffer(0);
DynamicDrawArrayBuffer d = a.create();

这将导致 ClassCastExceptioncreate 方法的返回类型是从调用站点推断出来的。此处调用站点提供的唯一信息是返回值必须是 DynamicDrawArrayBuffer - 因此 ArrayBuffer 被粗暴地转换为一个。

我认为您可以在这里轻松利用协方差:create 方法始终可以返回类的类型。然后,create 方法的返回类型由您调用该方法时所拥有的类型信息决定:

public class BufferTest
{
public static void main(String[] args)
{
ArrayBuffer a = new ArrayBuffer();
ArrayBuffer aa = a.create(); // Yes
// DynamicDrawArrayBuffer ad = a.create(); // No

DynamicDrawArrayBuffer d = new DynamicDrawArrayBuffer();
ArrayBuffer da = a.create(); // Yes
DynamicDrawArrayBuffer dd = d.create(); // Yes

Buffer b = a;
Buffer bb = b.create(); // Yes
//ArrayBuffer ba = b.create(); // No
}
}

class Buffer
{
public Buffer create()
{
// create etc...
return this;
}

}

class DynamicDrawArrayBuffer extends ArrayBuffer
{
@Override
public DynamicDrawArrayBuffer create()
{
super.create();
return this;
}
}

class ArrayBuffer extends Buffer
{
@Override
public ArrayBuffer create()
{
super.create();
return this;
}
}

关于java - 避免使用具有双扩展类的泛型进行未经检查的强制转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22501398/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com