2014-01-31 2 views
0

Я знаю, что это очень глупый вопрос, так как я когда-то знал такие вещи. Но сейчас мне очень трудно это сделать. У меня есть конструктор класса, который должен получить 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); 
+0

ли ваш 'Cursor' класс объявить тип переменной' T'? Как вы вызываете конструктор? –

+0

Вам нужно разместить больше кода. Начните со всего класса «Курсор». –

+0

Альтернативно, если вы не хотите переменную типа для всего вашего класса, вы можете объявить ее только для своего конструктора. –

ответ

2

В одном из ваших параметров конструктора, вы это заявил:

ArrayList<T extends CollisionObserver> 

Где в T взялось? Если вы хотите, чтобы этот ArrayList содержал элементы, привязанные по типу к этому классу, то здесь было бы полезно использовать T.

Из того, что, похоже, вы хотите получить список объектов, которые просто реализуют CollisionObserver, так что это будет заявление вы хотите:

ArrayList<? extends CollisionObserver> 
+0

Большое спасибо. Это решило. Я полностью испортил T и подстановочный знак. – Raistlin

1

Вы должны объявить свой класс, чтобы использовать общий тип T.

Пример

public class MyClass<T> 
+0

Это не будет. Я не хочу, чтобы класс Cursor был общим. Проблема заключается в списке параметров курсора. Он должен взять ArrayList с объектами, которые реализуют интерфейс CollisionObserver. – Raistlin

+0

Но вы пытаетесь использовать тип 'T'. Вы должны объявить это в заголовке класса или в конструкторе. Вы также можете использовать '?', Если вы не хотите ничего объявлять. – christopher

Смежные вопросы