基于泛型类型接口调用相应的方法

时间:2016-11-07 09:43:54

标签: java generics

我有以下课程

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>();

以便TGL3GL4,然后自动从查看器{{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); TGL3

编辑:从一些进一步的测试中,看起来如果我打电话

GL4

然后总是调用gl3构造函数,但是如果我输入

caps = new Caps(if(true) gl4 : gl3);

然后执行正确的构造函数......

Edit2:每个 if (GL4) { caps = Caps(gl4); } else { caps = Caps(gl3); } 都将被评估为true(opengl profile为gl3)..

instanceof

2 个答案:

答案 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