2017-05-26 72 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