变量类型的Java通用调用方法

时间:2012-05-04 08:07:44

标签: java generics reflection

我有一个关于Java中泛型的基本问题。 我有一个类X,它由另一个类T实例化。在每个类中,将使用一个名为methodOfT()的方法。但是,Java给了我编译器时间错误,因为它不知道obj和methodOfT()。

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)
{
}

在这种情况下,上述解决方案失败。有人可以帮忙。

1 个答案:

答案 0 :(得分:3)

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

编译器不知道T是什么,所以它被评估为Object。对象没有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);
     }  
}