繁体   English   中英

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

[英]Java abstract generic method with wild card implemented with concrete type

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

例如:

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

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

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

public class CorporateAuthorizer extends AbstractAuthorizer {

    @Override
    protected <CorporateUser> void authorize(CorporateUser user){
    }
}

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

当你做一些通用的东西时,你就是向用户做出承诺: 这将适用于满足泛型边界的任何类型 因此,通过在子类中选择特定类型,您就违反了该规则。 但是,如果您正确定义了超类,那么您也可以在满足类型检查器的同时获得所需的行为。 而不是使函数通用,使类成为通用的,然后当你子类化它时,你可以选择它的工作类型。

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) {}
}

抽象类声明了一个授权任何 <T extends User> 您的分机不符合此合同。

一些选择:

  1. 生成抽象类。

     abstract class AbstractAuthorizer<T extends User> { protected abstract void authorize(T user); } class CorporateAuthorizer extends AbstractAuthorizer<CorporateUser> { protected void authorize(final CorporateUser user) { // Do authorization. } } 
  2. 让扩展程序执行必要的检查。 类似的东西(使用AbstractAuthorizer定义):

     class CorporateAuthorizer extends AbstractAuthorizer { protected <T extends User> void authorize(final T user) { if (!(user instanceof CorporateUser)) { throw new UnsupportedOperationException("CorporateAuthorizer can only authorize 'CorporateUser' users"); } // Do authorization. } } 

如果您使用后者,我强烈建议另外一个abstract boolean supports(User user); 它执行上面的检查instanceof以便它可以用作:

boolean checkAuth(final User user) {
    boolean authorized = false;
    for (final AbstractAuthorizer authorizer : authorizers) {
        if (authorizer.supports(user)) {
            authorizer.authorize(user);
            authorised = true;
            // break; if only a single authorizer's check is required.
        }
    }
    return authorised;
}

我还要注意,在后者中使用<T extends User>的方法与仅仅使用User没有任何好处,除非您在授权时return User 也就是说,

abstract class AbstractAuthorizer {
    abstract boolean supports(User user);

    abstract <T extends User> T authorize(T user);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM