簡體   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