那么有没有什么办法可以绕过这个限制,让fooDerivedA和DerivedB类的方法可以有我想要的签名呢?
class SuperA{
}
class SuperB{
}
interface InterfaceA{
}
interface InterfaceB<T>{
<P extends T & InterfaceA> void foo(P param);
//error:type parameter cannot be followed by other bounds
}
class DerivedA extends SuperA implements InterfaceB<SuperA>{
@Override
<P extends SuperA & InterfaceA> void foo(P param){
//P should be some type extends SuperA and implements InterfaceA.
}
}
class DerivedB extends SuperB implements InterfaceB<SuperB>{
@Override
<P extends SuperB & InterfaceA> void foo(P param){
//P should be some type extends SuperB and implements InterfaceA.
}
}
Run Code Online (Sandbox Code Playgroud)
据我所知,你想做的事是做不到的。
您需要T在创建时进行限制,而不是稍后
interface InterfaceB<T extends InterfaceA>{
<P extends T> void foo(P param);
}
Run Code Online (Sandbox Code Playgroud)
否则,它将毫无意义,并且编译器不可能在编译时保证类型安全,而这正是泛型的首要目的。
如果没有限制,T类型可能Object不会实现您的接口,但是使用泛型参数创建实例Object在编译时不会失败,但调用它的方法不会是类型安全的,或者会在编译时失败,这没有什么意义。
但这不应该是问题,您可以将需要该签名的每个方法<P extends T & interface>放入另一个方法中InterfaceC,因为任何类都可以继承任意数量的接口,这最终将解决您的问题。
您的问题的可行解决方案可能看起来像这样。
class SuperA implements InterfaceA{
}
class SuperB implements InterfaceA{
}
interface InterfaceA{
}
interface InterfaceB<T extends InterfaceA>{
<P extends T> void foo(P param);
//error:type parameter cannot be followed by other bounds
}
class DerivedA extends SuperA implements InterfaceB<SuperA>{
@Override
public <P extends SuperA> void foo(P param) {
// TODO Auto-generated method stub
}
}
class DerivedB extends SuperB implements InterfaceB<SuperB>{
@Override
public <P extends SuperB> void foo(P param) {
// TODO Auto-generated method stub
}
}
Run Code Online (Sandbox Code Playgroud)
或者您可以创建SuperA和的子类SuperB来实现InterfaceB.
这是确保编译时类型安全的唯一方法。