我有以下课程
public class Viewer<T extends GL3> implements GLEventListener
GL3
是一个接口,依次由GL4
GLEventListener
是一个需要您实现多种方法的接口,例如:
public void init(GLAutoDrawable drawable);
我现在的实施是:
@Override
public void init(GLAutoDrawable drawable) {
@SuppressWarnings("unchecked")
T gl = (T) drawable.getGL();
caps = new Caps(gl);
}
我的目标是根据可用的opengl配置文件
实例化Viewer
viewer = new Viewer<GL4>();
或
viewer = new Viewer<GL3>();
以便T
为GL3
或GL4
,然后自动从查看器{{1}调用相应的caps
构造函数(gl3或gl4) }
问题如下,当我尝试实例化init
时,我得到:
Viewer
但如果我写 Redundant type arguments in new expression (use diamond operator instead).
explicit: Viewer<GL4>
inferred: Viewer<GL3>
,显然,它将不知道哪个在gl3和gl4之间选择
事实上,它最终总是调用gl3 cap构造函数..(我猜是因为有界泛型Viewer<>()
)
如果我强制T extends GL3
,它什么都不会改变..
所以我尝试了这个:
Viewer<GL4>()
它按计划工作,第一行将调用gl3 caps构造函数,第二行调用gl4一个
如何制作 GL3 gl3 = null;
GL4 gl4 = null;
caps = new Caps(gl3);
caps = new Caps(gl4);
T
或GL3
?
编辑:从一些进一步的测试中,看起来如果我打电话
GL4
然后总是调用gl3构造函数,但是如果我输入
caps = new Caps(if(true) gl4 : gl3);
然后执行正确的构造函数......
Edit2:每个 if (GL4) {
caps = Caps(gl4);
} else {
caps = Caps(gl3);
}
都将被评估为true(opengl profile为gl3)..
instanceof
答案 0 :(得分:0)
这种类型 - 擦除相关问题的“典型”解决方案可能已经足够了:更改Viewer的构造函数以获取Class<T>
参数。
答案 1 :(得分:0)
我认为您最好在Viewer构造函数中注入GL3或GL4,而不是使用泛型类型。 Viewer实现的接口是GLEventListener,对吧?无论如何你还需要一个GL3或GL4实例,不是吗? 因此,声明一个构造函数
public Viewer(GL3 gl) {
this.gl = gl;
}
然后当您需要GL4功能(如果可用)时,使用 instanceof 有条件地执行将GL3转换为GL4