Я знаю, что это очень глупый вопрос, так как я когда-то знал такие вещи. Но сейчас мне очень трудно это сделать. У меня есть конструктор класса, который должен получить ArrayList, заполненный объектами, реализующими мой интерфейс CollisionObserver. Вот мой конструктор-руководитель:Дженерики в конструкторских параметрах
public Cursor(GL gl, LibraryFinger finger, Vector direction, float radius,
int index, ArrayList<T extends CollisionObserver> observerList)
Может кто-нибудь сказать мне, где я совершу большую ошибку? Я тоже пробовал ArrayList<CollisionObserver>
, но это тоже не сработает, поскольку, когда я вызываю конструктор с объектами, которые реализуют CollisionObserver, сообщение об ошибке говорит, что конструктор unifined.
Ok, вот полный класс Cursor:
public class Cursor implements CollisionSubject{
private Vector direction;
private GL gl;
private float radius;
private LibraryFinger finger;
private GLUT glut;
protected static float[] sphere_center = new float[3];
private ArrayList<CollisionObserver> observer = new ArrayList<CollisionObserver>();
public Cursor(GL gl, LibraryFinger finger, Vector direction, float radius, int index, ArrayList<T extends CollisionObserver> observerList){
this.gl = gl;
this.finger = finger;
this.direction = direction;
this.radius = radius;
glut = new GLUT();
//Finetuning for fingermovements! The vector delivered by the LeapListener is to be considered as
//raw-data. It has to be adjusted to the environment in which the fingertracking is used.
sphere_center[0] = (float) (finger.getX()/15);
sphere_center[1] = (float) ((finger.getY()/20)*-1);
sphere_center[2] = (float) (finger.getZ()/5);
gl.glTranslatef(sphere_center[0], sphere_center[1], sphere_center[2]);
gl.glEnable(GL.GL_CULL_FACE);
gl.glCullFace(GL.GL_BACK);
gl.glColor3f(0.757f, 0.804f, 0.804f);
glut.glutSolidSphere(radius, 16, 16);
for (int i = 0; i < index; i++){
registerCollisionObserver(observerList.get(i));
}
myPosition();
}
@Override
public void registerCollisionObserver(CollisionObserver o) {
observer.add(o);
}
@Override
public void removeCollisionObserver(CollisionObserver o) {
if (!observer.isEmpty()) {
int i = observer.indexOf(o);
if (i >= 0)
observer.remove(i);
}
}
@Override
public void myPosition() {
for (int i = 0; i < observer.size(); i++) {
CollisionObserver o = observer.get(i);
o.collision(finger, direction, radius);
}
}
и вот как я вызвать конструктор. Я делаю это в двух разных классах. Первый класс:
private ArrayList<Picture> picList = new ArrayList<Picture>();
типа "Picture" реализует интерфейс CollisionObserver
Cursor finger = new Cursor(gl, lfl[i], listener.getFl().get(i).direction(), 0.5f, picList.size(), picList);
То же самое с классом два. Тип Shelf реализует интерфейс CollisionObserver:
private ArrayList<Shelf> shelfList = new ArrayList<Shelf>();
Cursor finger = new Cursor(gl, lfl[i], listener.getFl().get(i).direction(), 0.5f, shelfList.size(), shelfList);
ли ваш 'Cursor' класс объявить тип переменной' T'? Как вы вызываете конструктор? –
Вам нужно разместить больше кода. Начните со всего класса «Курсор». –
Альтернативно, если вы не хотите переменную типа для всего вашего класса, вы можете объявить ее только для своего конструктора. –