假设我正在定义一个类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的对象进行参数化。我缺少什么?
答案 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
对象(当然不能实例化)。