我有一个关于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)
{
}
在这种情况下,上述解决方案失败。有人可以帮忙。
答案 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);
}
}