2012-05-04 8 views
0

У меня есть основной вопрос о дженериках в Java. У меня есть класс X, который создается экземпляром другого класса T. В каждом классе T, который будет использоваться, есть метод, называемый methodOfT(). Однако Java дает мне ошибку времени компилятора, поскольку она не знает obj и methodOfT().Java Generic Calling Method of Variable Type

public class X<T> 
{ 
    T obj; 
    public void methodOfX() 
    { 
      obj.methodOfT(); 
    } 
} 

Во избежание этой проблемы, что я сделал, я определил другой класс XSuper. И каждый класс, который хочет создать экземпляр X, расширит этот класс XSuper. Это устраняет ошибку времени компиляции и позволяет мне достичь того, что я хочу.

public abstract class XSuper 
{ 
    public abstract void methodOfT(); 
} 

public class UserOfX extends XSuper 
{ 
    X<UserOfX> objX = new X<UserOfX>(); 
    public void methodOfT() 
    { 
    } 
} 

Однако, я хочу знать более чистый способ сделать это. Поскольку я хочу получить класс UserOfX из другого класса. Другая проблема заключается в том, что я хочу, чтобы определить метод methodOfT(), как -

public methodOfT(T objOfT) 
{ 
} 

В этом случае указанное решение не удается. Может кто-то помочь.

ответ

3
public class X<T> 
{ 
    T obj; 
    public void methodOfX() 
    { 
      obj.methodOfT(); 
    } 
} 

Компилятор не знает, что такое T, поэтому он оценивается как объект. Объект не имеет метода methodOfT, поэтому компиляция не выполняется. Вот как решить, что:

public interface SomeInterface{ 
    void methodOfT(); 
} 
public class X<T extends SomeInterface> 
{ 
    T obj; 
    public void methodOfX() 
    { 
      obj.methodOfT(); 
    } 
} 

В этом случае компилятор знает, что прилагаемая T будет реализовывать интерфейс SomeInterface и, следовательно, имеют метод methodOfT. (Вы также можете использовать классы вместо интерфейсов, но это менее элегантно)

Учитывая ваши дополнительные требования, мы будем иметь т изменить этот код еще немного:

public interface SomeInterface<X>{ 
    void methodOfT(X object); 
} 
public class X<T1, T2 extends SomeInterface<T1>> 
{ 
    T1 obj1; 
    T2 obj2; 
    public void methodOfX() 
    { 
      obj2.methodOfT(obj1); 
    } 
} 
+0

Спасибо за ответ. Но, как я сказал, это решение потерпит неудачу, если я хочу, чтобы этот метод был «obj.MethodOfT (T anotherObjOfT)» – Raj

+0

@RajTendulkar, в этом случае нам придется также сделать общий интерфейс, см. Мое обновление. –

+0

Это помогает! Спасибо Большое. – Raj