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