java中泛型类型的组合

时间:2013-11-28 05:25:27

标签: java generics

假设我正在定义一个类User,它具有扩展Principal的泛型类型

public abstract class User<P extends Principal> {
}

我有一个动作基类,应该由用户参数化:

public abstract class Action<U extends User<Principal>> {
}

这两个类都在muy代码库上。现在,我想在特定的应用程序上使用它们,因此我为Principal和User创建了一个实现:

public class MyPrincipal implements Principal {
    public String getName() {
        return "Administrator";
    }
}

public class MyUser extends User<MyPrincipal>{
}

一旦我拥有了我的用户,我就想在行动中使用它

public class MyAction extends Action<MyUser>{
}

这最后一个类不能编译。它抱怨说:

Bound mismatch: The type MyUser is not a valid substitute for the bounded parameter <U extends User<Principal>> of the type Action<U>

我想要的是强制所有扩展MyAction的类都应该使用扩展User的对象进行参数化,并且还要通过实现Principal的对象进行参数化。我缺少什么?

2 个答案:

答案 0 :(得分:3)

目前,Action课程的界限显示为U extends User<Principal>。由于MyUser不能延伸User<Principal>,而是User<MyPrincipal>,因此无法按预期工作。 User<MyPrincipal>不是User<Principal>(不同类型)。

您可以在Action类中引入另一个类型参数,并在U的范围内使用它:

public abstract class Action<P extends Principal, U extends User<P>> {
}

现在,您可以像这样创建MyAction

public class MyAction extends Action<MyPrincipal, MyUser>{
}

或者您也可以使用通配符绑定修改您的类:

public abstract class Action<U extends User<? extends Principal>> {
}

这样您就不需要其他类型参数:

public class MyAction extends Action<MyUser>{
}

<强>参考文献:

答案 1 :(得分:2)

Action的签名更改为此(我在Eclipse中对其进行了测试并编译):

public abstract class Action<U extends User<? extends Principal>>

通过这样做,你说任何类型的Principal都可以,而不仅仅是基类型Principal对象(当然不能实例化)。