泛型混乱

时间:2011-07-18 20:08:00

标签: java generics

通用标题道歉,我无法想到解释这一点的方法。

我想建模一个系统为用户提供设施的场景,这些用户将策略应用于请求对这些设施

public interface Facility {
    public List<Policy> getPolicies();
}
public interface Policy {
    public void apply(Facility facility, Request request);
}
public interface Request {

}

但是请求只能对特定类型的设施有效,并且策略实际上只能应用于某种类型的设施和特定于该类型设施的请求类型。

public interface Facility<F extends Facility<F>> {
    public List<Policy<F, ? extends Request<F>>> getPolicies();
}
public interface Policy<F extends Facility<F>, R extends Request<F>> {
    public void apply(F facility, R request);
}
public interface Request<F extends Facility<F>> {

}

但我也希望能够整体指定策略,以便它们可以应用于任何Facility超类型。

public interface Facility<F extends Facility<F>> {
    public List<Policy<? super F, ? extends Request<F>>> getPolicies();
}

但实际上,您只是想要查询适用于该设施的特定类型请求的策略。

public interface Facility<F extends Facility<F>> {
    public <R extends Request<F>> List<Policy<? super F, R>> getPolicies();
}

我现在的问题是我对所有的泛型都很困惑,我甚至无法创建一个适用于所有设施的政策类,如果是合法的话就会是这样的

public class GeneralPolicy implements Policy<T extends Facility<T>, Request<T>>

如何根据上述说明以有意义的方式关联设施,政策和要求的类型?我相信人们会要求澄清,我已经与这个问题进行了长时间的斗争,以至于我可能没有解释某些内容,或者完全错过了一个明显的观点。

1 个答案:

答案 0 :(得分:4)

如果我读得正确,你真正想做的就是获得适用于R的所有政策。

public interface Facility<F extends Facility<F>> {
    public <R extends Request<F>> List<Policy<? super F, R>> getPolicies();
}

不幸的是,由于类型擦除,你不能。在运行时,编译器不知道R是什么。

然而,你可以做的是通过以下课程:

public interface Facility<F extends Facility<F>> {
    public <R extends Request<F>> List<Policy<? super F, R>> getPolicies(Class<R> requestClass);
}

然后,Policy也需要返回其请求类型:

public interface Policy<F extends Facility<F>, R extends Request<F>> {
    public void apply(F facility, R request);

    public Class<R> getRequestClass();
}

然后,设施的实施可以通过可用策略列表,检查策略的请求类型是否与实际请求的类型匹配,并返回该子集。

对于全局策略,策略可以返回Request.class。对于特定的,MyRequest.class。

此外,我会说Facility(至少你在那里的方式)不需要通用化,它会使代码更简单。