类型参数后面不能跟其他边界解决方法

J. *_*Doe 7 java generics

那么有没有什么办法可以绕过这个限制,让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)

Hop*_*ful 1

据我所知,你想做的事是做不到的。

您需要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.

这是确保编译时类型安全的唯一方法。