0

我有一个关于 Java 泛型的基本问题。我有一个由另一个类 T 实例化的类 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)
{
}

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

4

1 回答 1

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);
     }  
}
于 2012-05-04T08:11:09.720 回答