2017-05-26 74 views
1

我有一個通用的使用有限制類型參數來限制這種類型的抽象類:繼承的限制類型參數,以LIMITE類型

public abstract class AbstractCreator<T extends Request> { 
    .... 
} 

然後我從AbstractCreator和一個多子女使用另一個界類型參數像未來:

public abstract class AbstractBigCreator<U extends BigRequest> extends AbstractCreator<U> { 
    U request; 
    ... 
} 

的接口界類型都像下一個:

public interface Request<T extends Some> { 
    T getRequest(); 
} 
public interface BigRequest<T extends SomeOther> extends Request<T> { 

} 

我的問題是這個孩子與另一個有界的類型參數限制在它自己的父類有界的類型參數,而不是這個類型參數。所以如果我打電話getRequest()U request我得到它是<T extends Some>而不是<T extends SomeOther>

我想到:

U request; 
request.getRequest(); //Class <T extends SomeOther> 

而是我得到:

U request; 
request.getRequest(); //Class <T extends Some> 

任何人都知道發生了什麼事?

+0

爲什麼'AbstractBigCreator'中不能有2個(有界)的類型參數? – syntagma

+0

我試圖重現你的問題,但我不能;對於我來說,U的推斷類型按預期擴展了'BigRequest'。你在哪裏看到編譯器認爲它擴展了'Request'的事實?是當你調用一個方法或什麼的? –

+0

已更新的問題。現在更具體。 – Pau

回答

1

問題是request屬性爲Request,而不是BigRequest類型在AbstractBigCreator類。

實際的問題是,您的BigRequest接口正在擴展接口Request,因此您繼承了T getRequest()方法的定義。而在Request中,T類型的範圍是Some,因此在BigRequest中也是如此。

的最簡單的解決方案是重新定義在BigRequest接口的T getRequest()方法,使得covariance施加到getRequest方法的返回類型。這意味着BigRequest接口的getRequest方法將返回SomeOther而不是Some

只是這樣做:

public interface BigRequest<T extends SomeOther> extends Request<T> { 

    @Override 
    T getRequest(); 
} 

你就可以在AbstractBigCreator調用request.getRequest()後訪問SomeOther