具有具体类型的通配符的Java抽象通用方法

use*_*326 4 java generics wildcard

在Java中是否可以使用通配符定义抽象方法,但在实现中使用具体类型

例如:

在这样的抽象类中定义抽象方法

public abstract class AbstractAuthorizer {
    abstract protected <T extends User> void authorize( T user );
}
Run Code Online (Sandbox Code Playgroud)

实现这样的抽象方法,CorporateUser扩展User:

public class CorporateAuthorizer extends AbstractAuthorizer {

    @Override
    protected <CorporateUser> void authorize(CorporateUser user){
    }
}
Run Code Online (Sandbox Code Playgroud)

Sil*_*olo 5

不,您不能直接做您想要的。但是,您可以获得相同的效果。

当您做出通用的东西时,您就是在向用户作出承诺:这将适用于满足通用范围的任何类型。因此,通过在子类中选择特定的类型,就可以打破该规则。但是,如果正确定义了超类,则在满足类型检查器的同时也可以获得所需的行为。不必使函数具有通用性,而应使类具有通用性,然后在对它进行子类化时,可以选择对其起作用的类型。

public abstract class AbstractAuthorizer<T extends User> {
    abstract protected void authorize( T user );
}

public class CorporateAuthorizer extends AbstractAuthorizer<CorporateUser> {
    @Override
    protected void authorize(CorporateUser user) {}
}
Run Code Online (Sandbox Code Playgroud)